Merge "Merged insert and upsert adapters; piped adapter to processor" into androidx-main
diff --git a/OWNERS b/OWNERS
index 6e081c7..b6e6906 100644
--- a/OWNERS
+++ b/OWNERS
@@ -5,10 +5,12 @@
 ccraik@google.com
 clarabayarri@google.com
 emberrose@google.com
+fsladkey@google.com
 ilake@google.com
 jeffrygaston@google.com
 jellefresen@google.com
 jsproch@google.com
+juliamcclellan@google.com
 lpf@google.com
 mount@google.com
 natnaelbelay@google.com
diff --git a/activity/integration-tests/testapp/lint-baseline.xml b/activity/integration-tests/testapp/lint-baseline.xml
index cba2783..5bc6817 100644
--- a/activity/integration-tests/testapp/lint-baseline.xml
+++ b/activity/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="cli" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml b/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
index 9702a61..7683bde 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.3.0-alpha07" type="baseline" client="cli" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml b/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
index f924709..eabfd5a 100644
--- a/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
+++ b/ads/ads-identifier/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -7,9 +7,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"
-            line="51"
-            column="29"/>
+            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"/>
     </issue>
 
     <issue
@@ -18,9 +16,7 @@
         errorLine1="    public void getId(View view) {"
         errorLine2="                      ~~~~">
         <location
-            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"
-            line="57"
-            column="23"/>
+            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"/>
     </issue>
 
     <issue
@@ -29,9 +25,7 @@
         errorLine1="    public void getIdSync(View view) {"
         errorLine2="                          ~~~~">
         <location
-            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"
-            line="76"
-            column="27"/>
+            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"/>
     </issue>
 
     <issue
@@ -40,9 +34,7 @@
         errorLine1="    public void isProviderAvailable(View view) {"
         errorLine2="                                    ~~~~">
         <location
-            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"
-            line="98"
-            column="37"/>
+            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"/>
     </issue>
 
     <issue
@@ -51,9 +43,7 @@
         errorLine1="    public void listProvider(View view) {"
         errorLine2="                             ~~~~">
         <location
-            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"
-            line="106"
-            column="30"/>
+            file="src/main/java/androidx/ads/identifier/testapp/AdsIdentifierActivity.java"/>
     </issue>
 
 </issues>
diff --git a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
index a4b68bb..1822def 100644
--- a/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
+++ b/annotation/annotation-experimental-lint/integration-tests/lint-baseline.xml
@@ -1,5 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="ExperimentalAnnotationRetention"
+        message="Experimental annotation has `RUNTIME` retention, should use default (`CLASS`)"
+        errorLine1="public @interface ExperimentalJavaAnnotationWrongRetention {}"
+        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/ExperimentalJavaAnnotationWrongRetention.java"/>
+    </issue>
 
     <issue
         id="ExperimentalAnnotationRetention"
@@ -16,11 +25,29 @@
         errorLine1="annotation class ExperimentalKotlinAnnotationWrongRetention"
         errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
+            file="src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongRetention.kt"/>
+    </issue>
+
+    <issue
+        id="ExperimentalAnnotationRetention"
+        message="Experimental annotation has default (`RUNTIME`) retention, should use `BINARY`"
+        errorLine1="annotation class ExperimentalKotlinAnnotationWrongRetention"
+        errorLine2="                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
             file="src/main/java/sample/optin/ExperimentalKotlinAnnotationWrongRetention.kt"/>
     </issue>
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="    static class ConcreteExperimentalInterface implements ExperimentalInterface { // unsafe"
+        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562469.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="    static class ConcreteExperimentalInterface implements ExperimentalInterface { // unsafe"
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~">
@@ -30,6 +57,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        public void experimentalMethod() {} // unsafe override"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562469.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        public void experimentalMethod() {} // unsafe override"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~">
@@ -39,6 +75,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        ExperimentalInterface anonymous = new ExperimentalInterface() { // unsafe"
+        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562469.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        ExperimentalInterface anonymous = new ExperimentalInterface() { // unsafe"
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~">
@@ -48,6 +93,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="            public void experimentalMethod() {} // unsafe override"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562469.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="            public void experimentalMethod() {} // unsafe override"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~">
@@ -57,6 +111,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        ExperimentalInterface lambda = () -> {}; // unsafe"
+        errorLine2="                                       ~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562469.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        ExperimentalInterface lambda = () -> {}; // unsafe"
         errorLine2="                                       ~~~~~~~~">
@@ -66,6 +129,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        public void experimentalMethod() {} // unsafe override"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562926.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        public void experimentalMethod() {} // unsafe override"
         errorLine2="                    ~~~~~~~~~~~~~~~~~~">
@@ -75,6 +147,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="            public void experimentalMethod() {} // unsafe override"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562926.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="            public void experimentalMethod() {} // unsafe override"
         errorLine2="                        ~~~~~~~~~~~~~~~~~~">
@@ -84,6 +165,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        StableInterface lambda = () -> {}; // unsafe override"
+        errorLine2="                                 ~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava192562926.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        StableInterface lambda = () -> {}; // unsafe override"
         errorLine2="                                 ~~~~~~~~">
@@ -93,6 +183,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        foo.defaultExperimentalMethod(); // unsafe in Java but safe in Kotlin"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava193110413.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        foo.defaultExperimentalMethod(); // unsafe in Java but safe in Kotlin"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -102,6 +201,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        foo.experimentalMethod(); // unsafe"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava193110413.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        foo.experimentalMethod(); // unsafe"
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
@@ -111,6 +219,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        Bar bar = new Bar(); // unsafe"
+        errorLine2="                  ~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava193110413.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        Bar bar = new Bar(); // unsafe"
         errorLine2="                  ~~~~~~~~~">
@@ -120,6 +237,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        bar.stableMethodLevelOptIn(); // unsafe due to experimental class scope"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava193110413.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        bar.stableMethodLevelOptIn(); // unsafe due to experimental class scope"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~">
@@ -129,6 +255,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        bar.experimentalMethod(); // unsafe"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/RegressionTestJava193110413.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        bar.experimentalMethod(); // unsafe"
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
@@ -138,6 +273,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();"
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -147,6 +291,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return experimentalObject.field;"
+        errorLine2="                                  ~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        return experimentalObject.field;"
         errorLine2="                                  ~~~~~">
@@ -156,6 +309,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();"
+        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();"
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -165,6 +327,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return experimentalObject.method();"
+        errorLine2="                                  ~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        return experimentalObject.method();"
         errorLine2="                                  ~~~~~~">
@@ -174,6 +345,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return AnnotatedJavaClass.FIELD_STATIC;"
+        errorLine2="                                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        return AnnotatedJavaClass.FIELD_STATIC;"
         errorLine2="                                  ~~~~~~~~~~~~">
@@ -183,6 +363,15 @@
 
     <issue
         id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return AnnotatedJavaClass.methodStatic();"
+        errorLine2="                                  ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with `@sample.optin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.optin.ExperimentalJavaAnnotation.class)`"
         errorLine1="        return AnnotatedJavaClass.methodStatic();"
         errorLine2="                                  ~~~~~~~~~~~~">
@@ -241,9 +430,7 @@
         errorLine1="        val dateProvider = DateProvider()"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"
-            line="29"
-            column="28"/>
+            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -252,9 +439,7 @@
         errorLine1="        return experimentalObject.field"
         errorLine2="                                  ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="29"
-            column="35"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -263,9 +448,7 @@
         errorLine1="        return dateProvider.date"
         errorLine2="                            ~~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"
-            line="30"
-            column="29"/>
+            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -274,9 +457,7 @@
         errorLine1="        val experimentalObject = AnnotatedJavaClass()"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="36"
-            column="34"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -285,9 +466,7 @@
         errorLine1="        return experimentalObject.method()"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="37"
-            column="35"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -296,9 +475,7 @@
         errorLine1="        return AnnotatedJavaClass.FIELD_STATIC"
         errorLine2="                                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="44"
-            column="35"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -307,9 +484,7 @@
         errorLine1="        return AnnotatedJavaClass.methodStatic()"
         errorLine2="                                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="51"
-            column="35"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -318,9 +493,7 @@
         errorLine1="        val locationProvider = LocationProvider()"
         errorLine2="                               ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"
-            line="57"
-            column="32"/>
+            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -329,9 +502,7 @@
         errorLine1="        return dateProvider.date + locationProvider.location"
         errorLine2="                                                    ~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"
-            line="58"
-            column="53"/>
+            file="src/main/java/sample/experimental/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -340,9 +511,7 @@
         errorLine1="        return stableObject.field"
         errorLine2="                            ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="77"
-            column="29"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -351,9 +520,7 @@
         errorLine1="        return stableObject.method()"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="85"
-            column="29"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -362,9 +529,7 @@
         errorLine1="        return AnnotatedJavaMembers.FIELD_STATIC"
         errorLine2="                                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="92"
-            column="37"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -373,9 +538,7 @@
         errorLine1="        return AnnotatedJavaMembers.methodStatic()"
         errorLine2="                                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="99"
-            column="37"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -384,9 +547,7 @@
         errorLine1="        return experimentalObject.method() + AnnotatedJavaClass2.FIELD_STATIC"
         errorLine2="                                                                 ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="108"
-            column="66"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -395,9 +556,7 @@
         errorLine1="        AnnotatedJavaMembers().field = -1"
         errorLine2="                               ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="144"
-            column="32"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -406,9 +565,7 @@
         errorLine1="        AnnotatedJavaMembers().field = -1"
         errorLine2="                                       ~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="144"
-            column="40"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -417,9 +574,7 @@
         errorLine1="        val value = AnnotatedJavaMembers().field"
         errorLine2="                                           ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="145"
-            column="44"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -428,9 +583,7 @@
         errorLine1="        AnnotatedJavaMembers().fieldWithSetMarker = -1"
         errorLine2="                               ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="146"
-            column="32"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
     </issue>
 
     <issue
@@ -439,9 +592,16 @@
         errorLine1="        AnnotatedJavaMembers().fieldWithSetMarker = -1"
         errorLine2="                                                    ~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"
-            line="146"
-            column="53"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalFromKt.kt"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return stableObject.field;"
+        errorLine2="                            ~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -450,9 +610,16 @@
         errorLine1="        return stableObject.field;"
         errorLine2="                            ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="30"
-            column="29"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return stableObject.method();"
+        errorLine2="                            ~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -461,9 +628,16 @@
         errorLine1="        return stableObject.method();"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="38"
-            column="29"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return AnnotatedJavaMembers.FIELD_STATIC;"
+        errorLine2="                                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -472,9 +646,16 @@
         errorLine1="        return AnnotatedJavaMembers.FIELD_STATIC;"
         errorLine2="                                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="45"
-            column="37"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        return AnnotatedJavaMembers.methodStatic();"
+        errorLine2="                                    ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -483,9 +664,25 @@
         errorLine1="        return AnnotatedJavaMembers.methodStatic();"
         errorLine2="                                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="52"
-            column="37"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        new AnnotatedJavaMembers().field = -1;"
+        errorLine2="                                   ~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        new AnnotatedJavaMembers().field = -1;"
+        errorLine2="                                           ~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -494,9 +691,7 @@
         errorLine1="        new AnnotatedJavaMembers().field = -1;"
         errorLine2="                                   ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="59"
-            column="36"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -505,9 +700,16 @@
         errorLine1="        new AnnotatedJavaMembers().field = -1;"
         errorLine2="                                           ~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="59"
-            column="44"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        int value = new AnnotatedJavaMembers().field;"
+        errorLine2="                                               ~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -516,9 +718,16 @@
         errorLine1="        int value = new AnnotatedJavaMembers().field;"
         errorLine2="                                               ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="60"
-            column="48"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        new AnnotatedJavaMembers().setFieldWithSetMarker(-1);"
+        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java"/>
     </issue>
 
     <issue
@@ -527,9 +736,16 @@
         errorLine1="        new AnnotatedJavaMembers().setFieldWithSetMarker(-1);"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"
-            line="61"
-            column="36"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMembersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation2` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation2.class)`"
+        errorLine1="        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMultipleMarkersFromJava.java"/>
     </issue>
 
     <issue
@@ -538,9 +754,16 @@
         errorLine1="        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java"
-            line="33"
-            column="51"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation2` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation2.class)`"
+        errorLine1="        return experimentalObject.method() + experimentalObject2.field;"
+        errorLine2="                                                                 ~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaExperimentalMultipleMarkersFromJava.java"/>
     </issue>
 
     <issue
@@ -549,9 +772,7 @@
         errorLine1="        return experimentalObject.method() + experimentalObject2.field;"
         errorLine2="                                                                 ~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java"
-            line="34"
-            column="66"/>
+            file="src/main/java/sample/optin/UseJavaExperimentalMultipleMarkersFromJava.java"/>
     </issue>
 
     <issue
@@ -560,9 +781,7 @@
         errorLine1="        Bar bar = new Bar();"
         errorLine2="                  ~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaPackageFromJava.java"
-            line="28"
-            column="19"/>
+            file="src/main/java/sample/experimental/UseJavaPackageFromJava.java"/>
     </issue>
 
     <issue
@@ -571,9 +790,25 @@
         errorLine1="        bar.baz();"
         errorLine2="            ~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaPackageFromJava.java"
-            line="29"
-            column="13"/>
+            file="src/main/java/sample/experimental/UseJavaPackageFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaPackageFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        experimentalObject.method();"
+        errorLine2="                           ~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaPackageFromJava.java"/>
     </issue>
 
     <issue
@@ -582,9 +817,7 @@
         errorLine1="        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaPackageFromJava.java"
-            line="33"
-            column="51"/>
+            file="src/main/java/sample/optin/UseJavaPackageFromJava.java"/>
     </issue>
 
     <issue
@@ -593,9 +826,7 @@
         errorLine1="        experimentalObject.method();"
         errorLine2="                           ~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaPackageFromJava.java"
-            line="34"
-            column="28"/>
+            file="src/main/java/sample/optin/UseJavaPackageFromJava.java"/>
     </issue>
 
     <issue
@@ -604,9 +835,16 @@
         errorLine1="        callPackageExperimental();"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaPackageFromJava.java"
-            line="52"
-            column="9"/>
+            file="src/main/java/sample/experimental/UseJavaPackageFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        safePropagateMarker();"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseJavaPackageFromJava.java"/>
     </issue>
 
     <issue
@@ -615,9 +853,7 @@
         errorLine1="        safePropagateMarker();"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaPackageFromJava.java"
-            line="67"
-            column="9"/>
+            file="src/main/java/sample/optin/UseJavaPackageFromJava.java"/>
     </issue>
 
     <issue
@@ -626,9 +862,7 @@
         errorLine1="        val experimentalObject = AnnotatedJavaPackage()"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"
-            line="30"
-            column="34"/>
+            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"/>
     </issue>
 
     <issue
@@ -637,9 +871,7 @@
         errorLine1="        experimentalObject.method()"
         errorLine2="                           ~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"
-            line="31"
-            column="28"/>
+            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"/>
     </issue>
 
     <issue
@@ -648,9 +880,7 @@
         errorLine1="        val bar = Bar()"
         errorLine2="                  ~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaPackageFromKt.kt"
-            line="32"
-            column="19"/>
+            file="src/main/java/sample/experimental/UseJavaPackageFromKt.kt"/>
     </issue>
 
     <issue
@@ -659,9 +889,7 @@
         errorLine1="        bar.baz()"
         errorLine2="            ~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaPackageFromKt.kt"
-            line="33"
-            column="13"/>
+            file="src/main/java/sample/experimental/UseJavaPackageFromKt.kt"/>
     </issue>
 
     <issue
@@ -670,9 +898,7 @@
         errorLine1="        callPackageExperimental()"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseJavaPackageFromKt.kt"
-            line="56"
-            column="9"/>
+            file="src/main/java/sample/experimental/UseJavaPackageFromKt.kt"/>
     </issue>
 
     <issue
@@ -681,9 +907,7 @@
         errorLine1="        callPackageExperimental()"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"
-            line="64"
-            column="9"/>
+            file="src/main/java/sample/optin/UseJavaPackageFromKt.kt"/>
     </issue>
 
     <issue
@@ -692,9 +916,7 @@
         errorLine1="        sample.experimental.DateProviderKt dateProvider = new sample.experimental.DateProviderKt();"
         errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="25"
-            column="59"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -703,9 +925,16 @@
         errorLine1="        return dateProvider.getDate();"
         errorLine2="                            ~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="26"
-            column="29"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalKotlinAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class)`"
+        errorLine1="        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();"
+        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -714,9 +943,16 @@
         errorLine1="        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="28"
-            column="51"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalKotlinAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class)`"
+        errorLine1="        return experimentalObject.method();"
+        errorLine2="                                  ~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -725,9 +961,7 @@
         errorLine1="        return experimentalObject.method();"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="29"
-            column="35"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -736,9 +970,7 @@
         errorLine1="        LocationProviderKt locationProvider = new LocationProviderKt();"
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="54"
-            column="47"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -747,9 +979,16 @@
         errorLine1="        return dateProvider.getDate() + locationProvider.getLocation();"
         errorLine2="                                                         ~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="55"
-            column="58"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalKotlinAnnotation2` or `@OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation2.class)`"
+        errorLine1="        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;"
+        errorLine2="                                                                   ~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -758,9 +997,7 @@
         errorLine1="        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;"
         errorLine2="                                                                   ~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="56"
-            column="68"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -769,9 +1006,7 @@
         errorLine1="        TimeProviderKt.getTimeStatically();"
         errorLine2="                       ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="88"
-            column="24"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -780,9 +1015,7 @@
         errorLine1="        TimeProviderKt.Companion.getTimeStatically();"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="89"
-            column="34"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -791,9 +1024,7 @@
         errorLine1="        new TimeProviderKt().getTime();"
         errorLine2="                             ~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="96"
-            column="30"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -802,9 +1033,16 @@
         errorLine1="        new TimeProviderKt().getTimeJava();"
         errorLine2="                             ~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"
-            line="97"
-            column="30"/>
+            file="src/main/java/sample/experimental/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalKotlinAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class)`"
+        errorLine1="        AnnotatedKotlinMembers.methodStatic();"
+        errorLine2="                               ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -813,9 +1051,16 @@
         errorLine1="        AnnotatedKotlinMembers.methodStatic();"
         errorLine2="                               ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="97"
-            column="32"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalKotlinAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class)`"
+        errorLine1="        AnnotatedKotlinMembers.Companion.methodStatic();"
+        errorLine2="                                         ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -824,9 +1069,16 @@
         errorLine1="        AnnotatedKotlinMembers.Companion.methodStatic();"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="98"
-            column="42"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalKotlinAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class)`"
+        errorLine1="        new AnnotatedKotlinMembers().method();"
+        errorLine2="                                     ~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -835,9 +1087,16 @@
         errorLine1="        new AnnotatedKotlinMembers().method();"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="107"
-            column="38"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalJavaAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class)`"
+        errorLine1="        new AnnotatedKotlinMembers().methodWithJavaMarker();"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -846,9 +1105,16 @@
         errorLine1="        new AnnotatedKotlinMembers().methodWithJavaMarker();"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="108"
-            column="38"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
+    </issue>
+
+    <issue
+        id="UnsafeOptInUsageError"
+        message="This declaration is opt-in and its usage should be marked with `@sample.kotlin.ExperimentalKotlinAnnotation` or `@OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class)`"
+        errorLine1="        new AnnotatedKotlinMembers().setFieldWithSetMarker(-1);"
+        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/sample/kotlin/UseKtExperimentalFromJava.java"/>
     </issue>
 
     <issue
@@ -857,9 +1123,7 @@
         errorLine1="        new AnnotatedKotlinMembers().setFieldWithSetMarker(-1);"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"
-            line="117"
-            column="38"/>
+            file="src/main/java/sample/optin/UseKtExperimentalFromJava.java"/>
     </issue>
 
 </issues>
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaClass.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaClass.java
new file mode 100644
index 0000000..e84b2db
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaClass.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 sample.kotlin;
+
+/**
+ * Class which is experimental.
+ */
+@ExperimentalJavaAnnotation
+public class AnnotatedJavaClass {
+    public static final int FIELD_STATIC = -1;
+
+    /**
+     * Method which is static.
+     */
+    public static int methodStatic() {
+        return -1;
+    }
+
+    /**
+     * Field which is final and dynamic.
+     */
+    public final int field = -1;
+
+    /**
+     * Method which is dynamic.
+     */
+    public int method() {
+        return -1;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaClass2.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaClass2.java
new file mode 100644
index 0000000..9eba282
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaClass2.java
@@ -0,0 +1,35 @@
+/*
+ * 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 sample.kotlin;
+
+/**
+ * Class which is experimental.
+ */
+@ExperimentalJavaAnnotation2
+class AnnotatedJavaClass2 {
+    public static final int FIELD_STATIC = -1;
+
+    public static int methodStatic() {
+        return -1;
+    }
+
+    public final int field = -1;
+
+    public int method() {
+        return -1;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaMembers.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaMembers.java
new file mode 100644
index 0000000..c619fbe
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedJavaMembers.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 sample.kotlin;
+
+/**
+ * Class which is stable but has experimental members.
+ */
+class AnnotatedJavaMembers {
+    @ExperimentalJavaAnnotation
+    public static final int FIELD_STATIC = -1;
+
+    private int mFieldWithSetMarker;
+
+    @ExperimentalJavaAnnotation
+    public static int methodStatic() {
+        return -1;
+    }
+
+    @ExperimentalJavaAnnotation
+    public int field = -1;
+
+    @ExperimentalJavaAnnotation
+    public int method() {
+        return -1;
+    }
+
+    public int getFieldWithSetMarker() {
+        return mFieldWithSetMarker;
+    }
+
+    @ExperimentalJavaAnnotation
+    public void setFieldWithSetMarker(int value) {
+        mFieldWithSetMarker = value;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinClass.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinClass.kt
new file mode 100644
index 0000000..c02b16b
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinClass.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 sample.kotlin
+
+@ExperimentalKotlinAnnotation
+open class AnnotatedKotlinClass {
+    val field: Int = -1
+
+    fun method(): Int {
+        return -1
+    }
+
+    companion object {
+        @JvmStatic
+        val fieldStatic: Int = -1
+
+        @JvmStatic
+        fun methodStatic(): Int {
+            return -1
+        }
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinClass2.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinClass2.kt
new file mode 100644
index 0000000..70c4d37
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinClass2.kt
@@ -0,0 +1,35 @@
+/*
+ * 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 sample.kotlin
+
+@ExperimentalKotlinAnnotation2
+open class AnnotatedKotlinClass2 {
+    val field: Int = -1
+
+    fun method(): Int {
+        return -1
+    }
+
+    companion object {
+        const val fieldStatic: Int = -1
+
+        @JvmStatic
+        fun methodStatic(): Int {
+            return -1
+        }
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinMembers.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinMembers.kt
new file mode 100644
index 0000000..016c733
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/AnnotatedKotlinMembers.kt
@@ -0,0 +1,47 @@
+/*
+ * 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 sample.kotlin
+
+open class AnnotatedKotlinMembers {
+    @ExperimentalKotlinAnnotation
+    var field: Int = -1
+
+    @set:ExperimentalKotlinAnnotation
+    var fieldWithSetMarker: Int = -1
+
+    @ExperimentalKotlinAnnotation
+    fun method(): Int {
+        return -1
+    }
+
+    @ExperimentalJavaAnnotation
+    fun methodWithJavaMarker(): Int {
+        return -1
+    }
+
+    internal companion object {
+        @JvmStatic
+        @ExperimentalKotlinAnnotation
+        fun methodStatic(): Int {
+            return -1
+        }
+
+        @JvmStatic
+        @ExperimentalKotlinAnnotation
+        val fieldStatic: Int = -1
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotation.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotation.java
new file mode 100644
index 0000000..43a5fdc
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotation.java
@@ -0,0 +1,24 @@
+/*
+ * 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 sample.kotlin;
+
+import static kotlin.RequiresOptIn.Level.ERROR;
+
+import kotlin.RequiresOptIn;
+
+@RequiresOptIn(level = ERROR)
+public @interface ExperimentalJavaAnnotation {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotation2.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotation2.java
new file mode 100644
index 0000000..2b45ea3
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotation2.java
@@ -0,0 +1,28 @@
+/*
+ * 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 sample.kotlin;
+
+import static kotlin.RequiresOptIn.Level.ERROR;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import kotlin.RequiresOptIn;
+
+@RequiresOptIn(level = ERROR)
+@Retention(RetentionPolicy.CLASS)
+public @interface ExperimentalJavaAnnotation2 {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotationWrongRetention.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotationWrongRetention.java
new file mode 100644
index 0000000..95eb9fe
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalJavaAnnotationWrongRetention.java
@@ -0,0 +1,28 @@
+/*
+ * 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 sample.kotlin;
+
+import static kotlin.RequiresOptIn.Level.ERROR;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import kotlin.RequiresOptIn;
+
+@RequiresOptIn(level = ERROR)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExperimentalJavaAnnotationWrongRetention {}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotation.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotation.kt
new file mode 100644
index 0000000..e3ac122
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotation.kt
@@ -0,0 +1,21 @@
+/*
+ * 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 sample.kotlin
+
+@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
+@Retention(AnnotationRetention.BINARY)
+annotation class ExperimentalKotlinAnnotation
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotation2.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotation2.kt
new file mode 100644
index 0000000..a7d6be3
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotation2.kt
@@ -0,0 +1,21 @@
+/*
+ * 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 sample.kotlin
+
+@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
+@Retention(AnnotationRetention.BINARY)
+annotation class ExperimentalKotlinAnnotation2
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongRetention.kt b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongRetention.kt
new file mode 100644
index 0000000..4c00000
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/ExperimentalKotlinAnnotationWrongRetention.kt
@@ -0,0 +1,21 @@
+/*
+ * 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 sample.kotlin
+
+@Suppress("unused")
+@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
+annotation class ExperimentalKotlinAnnotationWrongRetention
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava192562469.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava192562469.java
new file mode 100644
index 0000000..c00ad6c
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava192562469.java
@@ -0,0 +1,97 @@
+/*
+ * 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 sample.kotlin;
+
+import kotlin.OptIn;
+
+/**
+ * Regression test for b/192562469 where the lint check does not handle annotation usage in lambdas.
+ */
+@SuppressWarnings("unused")
+public class RegressionTestJava192562469 {
+    @ExperimentalJavaAnnotation
+    interface ExperimentalInterface {
+        void experimentalMethod();
+    }
+
+    /**
+     * Unsafe usage due to implementation of an experimental interface.
+     */
+    static class ConcreteExperimentalInterface implements ExperimentalInterface { // unsafe
+        @Override
+        public void experimentalMethod() {} // unsafe override
+    }
+
+    /**
+     * Safe usage due to opt-in.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    static class ConcreteExperimentalInterfaceOptIn implements ExperimentalInterface {
+        @Override
+        public void experimentalMethod() {} // safe
+    }
+
+    /**
+     * Safe usage due to propagation.
+     */
+    @ExperimentalJavaAnnotation
+    static class ConcreteExperimentalInterfacePropagate implements ExperimentalInterface {
+        @Override
+        public void experimentalMethod() {} // safe
+    }
+
+    /**
+     * Unsafe implementations of an experimental interface.
+     */
+    void regressionTestOverrides() {
+        @SuppressWarnings("Convert2Lambda")
+        ExperimentalInterface anonymous = new ExperimentalInterface() { // unsafe
+            @Override
+            public void experimentalMethod() {} // unsafe override
+        };
+
+        ExperimentalInterface lambda = () -> {}; // unsafe
+    }
+
+    /**
+     * Safe implementations of an experimental interface due to opt-in.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    void regressionTestOverridesOptIn() {
+        @SuppressWarnings("Convert2Lambda")
+        ExperimentalInterface anonymous = new ExperimentalInterface() { // safe
+            @Override
+            public void experimentalMethod() {} // safe
+        };
+
+        ExperimentalInterface lambda = () -> {}; // safe
+    }
+
+    /**
+     * Safe implementations of an experimental interface due to propagation.
+     */
+    @ExperimentalJavaAnnotation
+    void regressionTestOverridesPropagate() {
+        @SuppressWarnings("Convert2Lambda")
+        ExperimentalInterface anonymous = new ExperimentalInterface() { // safe
+            @Override
+            public void experimentalMethod() {} // safe
+        };
+
+        ExperimentalInterface lambda = () -> {}; // safe
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava192562926.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava192562926.java
new file mode 100644
index 0000000..ae767e0
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava192562926.java
@@ -0,0 +1,54 @@
+/*
+ * 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 sample.kotlin;
+
+/**
+ * Regression test for b/192562926 where the lint check should not flag overrides where there is
+ * no dependency on the superclass, e.g. calls to super().
+ */
+@SuppressWarnings("unused")
+public class RegressionTestJava192562926 {
+    interface StableInterface {
+        // This method will show up first in the list provided by PsiClass.allMethods, but it's
+        // not the method that we want to inspect since it has a concrete implementation.
+        default void abstractMethodWithDefault() {}
+
+        @ExperimentalJavaAnnotation
+        void experimentalMethod();
+    }
+
+    /**
+     * Safe override since super is not called.
+     */
+    static class ConcreteStableInterface implements StableInterface {
+        @Override
+        public void experimentalMethod() {} // unsafe override
+    }
+
+    /**
+     * Test different approaches to overriding interface methods.
+     */
+    void regressionTestOverrides() {
+        @SuppressWarnings("Convert2Lambda")
+        StableInterface anonymous = new StableInterface() {
+            @Override
+            public void experimentalMethod() {} // unsafe override
+        };
+
+        StableInterface lambda = () -> {}; // unsafe override
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava193110413.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava193110413.java
new file mode 100644
index 0000000..5272dff
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/RegressionTestJava193110413.java
@@ -0,0 +1,99 @@
+/*
+ * 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 sample.kotlin;
+
+import kotlin.OptIn;
+
+/**
+ * Regression test for b/193110413 where the lint check does not handle nested annotations.
+ */
+@SuppressWarnings("unused")
+public class RegressionTestJava193110413 {
+
+    @ExperimentalJavaAnnotation
+    interface ExperimentalInterface {
+        void experimentalMethod();
+        void anotherExperimentalMethod();
+
+        default void defaultExperimentalMethod() {
+            // Stub!
+        }
+    }
+
+    /**
+     * Safe usage due to opting in to the experimental annotation.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    static class Foo implements ExperimentalInterface {
+
+        @ExperimentalJavaAnnotation
+        @Override
+        public void experimentalMethod() {
+            // Stub!
+        }
+
+        @Override
+        public void anotherExperimentalMethod() {
+            // Stub!
+        }
+
+        public void stableClassLevelOptIn() {
+            // Stub!
+        }
+    }
+
+    /**
+     * Safe usage due to propagating the experimental annotation.
+     */
+    @ExperimentalJavaAnnotation
+    static class Bar implements ExperimentalInterface {
+
+        @Override
+        public void experimentalMethod() {
+            // Stub!
+        }
+
+        @Override
+        public void anotherExperimentalMethod() {
+            // Stub!
+        }
+
+        @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+        public void stableMethodLevelOptIn() {
+            // Stub!
+        }
+    }
+
+    /**
+     * Unsafe call to an experimental method where the containing class has opted-in to an
+     * unstable interface, thus the constructor and stable method calls are safe.
+     *
+     * The expected behavior has been verified against the Kotlin compiler's implementation of
+     * opt-in.
+     */
+    void regressionTestMixedStability() {
+        Foo foo = new Foo(); // safe
+        foo.stableClassLevelOptIn(); // safe
+        foo.anotherExperimentalMethod(); // safe
+        foo.defaultExperimentalMethod(); // unsafe in Java but safe in Kotlin
+        foo.experimentalMethod(); // unsafe
+
+        Bar bar = new Bar(); // unsafe
+        bar.stableMethodLevelOptIn(); // unsafe due to experimental class scope
+        bar.experimentalMethod(); // unsafe
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java
new file mode 100644
index 0000000..995c643
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalClassFromJava.java
@@ -0,0 +1,74 @@
+/*
+ * 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 sample.kotlin;
+
+import kotlin.OptIn;
+
+/**
+ * Tests for calls made to members on an experimental class.
+ */
+@SuppressWarnings({"unused", "WeakerAccess"})
+class UseJavaExperimentalClassFromJava {
+
+    /**
+     * Unsafe call into a field on an experimental class.
+     */
+    int unsafeExperimentalClassField() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.field;
+    }
+
+    /**
+     * Unsafe call into a method on an experimental class.
+     */
+    int unsafeExperimentalClassMethod() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.method();
+    }
+
+    /**
+     * Unsafe call into a static field on an experimental class.
+     */
+    int unsafeExperimentalClassStaticField() {
+        return AnnotatedJavaClass.FIELD_STATIC;
+    }
+
+    /**
+     * Unsafe call into a static method on an experimental class.
+     */
+    int unsafeExperimentalClassStaticMethod() {
+        return AnnotatedJavaClass.methodStatic();
+    }
+
+    /**
+     * Safe call due to propagation of experimental annotation.
+     */
+    @ExperimentalJavaAnnotation
+    int safePropagateMarker() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.method();
+    }
+
+    /**
+     * Safe call due to opting in to experimental annotation.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    int safeOptInMarker() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        return experimentalObject.method();
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java
new file mode 100644
index 0000000..4bd3f8dc
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalMembersFromJava.java
@@ -0,0 +1,64 @@
+/*
+ * 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 sample.kotlin;
+
+/**
+ * Tests for calls made to experimental members on a stable class.
+ */
+@SuppressWarnings({"unused", "WeakerAccess"})
+class UseJavaExperimentalMembersFromJava {
+
+    /**
+     * Unsafe call into an experimental field on a stable class.
+     */
+    int unsafeExperimentalField() {
+        AnnotatedJavaMembers stableObject = new AnnotatedJavaMembers();
+        return stableObject.field;
+    }
+
+    /**
+     * Unsafe call into an experimental method on a stable class.
+     */
+    int unsafeExperimentalMethod() {
+        AnnotatedJavaMembers stableObject = new AnnotatedJavaMembers();
+        return stableObject.method();
+    }
+
+    /**
+     * Unsafe call into an experimental static field on a stable class.
+     */
+    int unsafeExperimentalStaticField() {
+        return AnnotatedJavaMembers.FIELD_STATIC;
+    }
+
+    /**
+     * Unsafe call into an experimental static method on a stable class.
+     */
+    int unsafeExperimentalStaticMethod() {
+        return AnnotatedJavaMembers.methodStatic();
+    }
+
+    /**
+     * Unsafe references to experimental properties.
+     */
+    void unsafePropertyUsage() {
+        new AnnotatedJavaMembers().field = -1;
+        int value = new AnnotatedJavaMembers().field;
+        new AnnotatedJavaMembers().setFieldWithSetMarker(-1);
+        int value2 = new AnnotatedJavaMembers().getFieldWithSetMarker(); // safe
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalMultipleMarkersFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalMultipleMarkersFromJava.java
new file mode 100644
index 0000000..422980a
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaExperimentalMultipleMarkersFromJava.java
@@ -0,0 +1,68 @@
+/*
+ * 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 sample.kotlin;
+
+import kotlin.OptIn;
+
+/**
+ * Tests for calls involving multiple experimental markers.
+ */
+@SuppressWarnings({"unused", "WeakerAccess"})
+class UseJavaExperimentalMultipleMarkersFromJava {
+
+    /**
+     * Unsafe call into multiple experimental classes.
+     */
+    @ExperimentalJavaAnnotation
+    int unsafeMultipleExperimentalClasses() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+
+    /**
+     * Safe call due to propagation of both annotations.
+     */
+    @ExperimentalJavaAnnotation
+    @ExperimentalJavaAnnotation2
+    int safePropagateMultipleMarkers() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+
+    /**
+     * Safe call due to opt-in of one annotation and propagation of another.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    @ExperimentalJavaAnnotation2
+    int safePropagateAndOptInMarkers() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+
+    /**
+     * Safe call due to opt-in of both annotations.
+     */
+    @OptIn(markerClass = { ExperimentalJavaAnnotation.class, ExperimentalJavaAnnotation2.class })
+    int safeOptInMultipleMarkers() {
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+        return experimentalObject.method() + experimentalObject2.field;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaPackageFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaPackageFromJava.java
new file mode 100644
index 0000000..c364f63
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseJavaPackageFromJava.java
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ */
+
+package sample.kotlin;
+
+import kotlin.OptIn;
+import sample.kotlin.foo.AnnotatedJavaPackage;
+
+/**
+ * Tests for calls made on classes within an experimental package.
+ */
+@SuppressWarnings("unused")
+class UseJavaPackageFromJava {
+
+    /**
+     * Unsafe call into a method on a class within an experimental package.
+     */
+    void unsafeMethodInExperimentalPackage() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
+    }
+
+    /**
+     * Safe call due to propagation of experimental marker.
+     */
+    @ExperimentalJavaAnnotation
+    void safePropagateMarker() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
+    }
+
+    /**
+     * Safe call due to opt-in to experimental marker.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    void safeOptInMarker() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
+    }
+
+    /**
+     * Unsafe call into a method with an unsafe call. This should not be flagged, as the
+     * called method itself is not experimental.
+     */
+    void unsafeSelfExperimental() {
+        unsafeMethodInExperimentalPackage();
+    }
+
+    /**
+     * Unsafe call into an experimental method within this class.
+     */
+    void unsafeSelfPropagateMarker() {
+        safePropagateMarker();
+    }
+
+    /**
+     * Safe call into an opted-in method within this class.
+     */
+    void safeSelfOptInMarker() {
+        safeOptInMarker();
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseKtExperimentalFromJava.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseKtExperimentalFromJava.java
new file mode 100644
index 0000000..8603d23
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/UseKtExperimentalFromJava.java
@@ -0,0 +1,132 @@
+/*
+ * 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.
+ */
+
+package sample.kotlin;
+
+import kotlin.OptIn;
+
+@SuppressWarnings({"unused", "WeakerAccess"})
+class UseKtExperimentalFromJava {
+
+    /**
+     * Unsafe call into an experimental class.
+     */
+    int unsafeExperimentalClassField() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method();
+    }
+
+    /**
+     * Safe call due to propagation of experimental annotation.
+     */
+    @ExperimentalKotlinAnnotation
+    int safePropagateMarker() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method();
+    }
+
+    /**
+     * Safe call due to opting in to experimental annotation.
+     */
+    @OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    int safeOptInMarker() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method();
+    }
+
+    /**
+     * Unsafe call into multiple experimental classes.
+     */
+    @ExperimentalKotlinAnnotation
+    int unsafeMultipleExperimentalClasses() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+    }
+
+    /**
+     * Safe call due to propagation of both annotations.
+     */
+    @ExperimentalKotlinAnnotation
+    @ExperimentalKotlinAnnotation2
+    int safePropagateMultipleMarkers() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+    }
+
+    /**
+     * Safe call due to opt-in of one annotation and propagation of another.
+     */
+    @OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    @ExperimentalKotlinAnnotation2
+    int safePropagateAndOptInMarkers() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+    }
+
+    /**
+     * Safe call due to opt-in of both annotations.
+     */
+    @OptIn(markerClass = {
+            ExperimentalKotlinAnnotation.class,
+            ExperimentalKotlinAnnotation2.class
+    })
+    int safeOptInMultipleMarkers() {
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+    }
+
+    /**
+     * Unsafe calls into static methods.
+     *
+     * Regression test for issue reported in b/140637106, which passes here but fails in Studio.
+     */
+    void regressionTestStaticUsage() {
+        AnnotatedKotlinMembers.methodStatic();
+        AnnotatedKotlinMembers.Companion.methodStatic();
+    }
+
+    /**
+     * Unsafe calls into methods without intermediate variable.
+     *
+     * Regression test for issue reported in b/140637106, which passes here but fails in Studio.
+     */
+    void regressionTestInlineUsage() {
+        new AnnotatedKotlinMembers().method();
+        new AnnotatedKotlinMembers().methodWithJavaMarker();
+    }
+
+    /**
+     * Unsafe references to experimental properties.
+     */
+    void unsafePropertyUsage() {
+        new AnnotatedKotlinMembers().setField(-1);
+        int value = new AnnotatedKotlinMembers().getField();
+        new AnnotatedKotlinMembers().setFieldWithSetMarker(-1);
+        int value2 = new AnnotatedKotlinMembers().getFieldWithSetMarker(); // safe
+    }
+
+    /**
+     * Safe usage due to opting in to experimental annotation.
+     */
+    @OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    static class ExtendsAnnotatedKotlinClass extends AnnotatedKotlinClass {}
+
+    /**
+     * Safe usage due to opting in to experimental annotation.
+     */
+    @kotlin.OptIn(markerClass = ExperimentalKotlinAnnotation.class)
+    static class ExtendsAnnotatedKotlinClass2 extends AnnotatedKotlinClass {}
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/AnnotatedJavaPackage.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/AnnotatedJavaPackage.java
new file mode 100644
index 0000000..75fd016
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/AnnotatedJavaPackage.java
@@ -0,0 +1,30 @@
+/*
+ * 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 sample.kotlin.foo;
+
+/**
+ * Class which lives in an experimental package.
+ */
+public class AnnotatedJavaPackage {
+
+    /**
+     * Method that inherits experimental status from its package.
+     */
+    public int method() {
+        return -1;
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/RegressionTestJava218798815.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/RegressionTestJava218798815.java
new file mode 100644
index 0000000..83896c9
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/RegressionTestJava218798815.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 sample.kotlin.foo;
+
+import kotlin.OptIn;
+import sample.kotlin.ExperimentalJavaAnnotation;
+
+/**
+ * Regression test for b/218798815 where the lint check yields false positives on usages within an
+ * annotated package.
+ */
+@SuppressWarnings("unused")
+public class RegressionTestJava218798815 {
+
+    /**
+     * Safe call into a method on a class within the same experimental package.
+     */
+    void safeMethodInExperimentalPackage() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
+    }
+
+    /**
+     * Safe call with redundant propagation of experimental marker.
+     */
+    @ExperimentalJavaAnnotation
+    void safePropagateMarker() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
+    }
+
+    /**
+     * Safe call with unnecessary and invalid opt-in to experimental marker.
+     */
+    @OptIn(markerClass = ExperimentalJavaAnnotation.class)
+    void safeOptInMarker() {
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+        experimentalObject.method();
+    }
+
+    /**
+     * Safe call into a method with an safe call. This should not be flagged, as the
+     * called method itself is not experimental.
+     */
+    void safeSelfExperimental() {
+        safeMethodInExperimentalPackage();
+    }
+
+    /**
+     * Safe call into a redundantly-annotated experimental method within the same experimetnal
+     * package.
+     */
+    void safeSelfPropagateMarker() {
+        safePropagateMarker();
+    }
+}
diff --git a/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/package-info.java b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/package-info.java
new file mode 100644
index 0000000..abc33f1
--- /dev/null
+++ b/annotation/annotation-experimental-lint/integration-tests/src/main/java/sample/kotlin/foo/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+@ExperimentalJavaAnnotation
+package sample.kotlin.foo;
+
+import sample.kotlin.ExperimentalJavaAnnotation;
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/KotlinAnnotationsDetectorTest.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/KotlinAnnotationsDetectorTest.kt
new file mode 100644
index 0000000..cfefb3a
--- /dev/null
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/KotlinAnnotationsDetectorTest.kt
@@ -0,0 +1,414 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.annotation.experimental.lint
+
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestFiles.base64gzip
+import com.android.tools.lint.checks.infrastructure.TestFiles.kotlin
+import com.android.tools.lint.checks.infrastructure.TestLintResult
+import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
+import com.android.tools.lint.checks.infrastructure.TestMode
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+/**
+ * Tests for usage of Kotlin opt-in annotations from Java sources.
+ */
+@RunWith(JUnit4::class)
+class KotlinAnnotationsDetectorTest {
+
+    private fun check(vararg testFiles: TestFile): TestLintResult {
+        return lint()
+            .files(
+                ANDROIDX_REQUIRES_OPT_IN_KT,
+                ANDROIDX_OPT_IN_KT,
+                *testFiles
+            )
+            .issues(*ExperimentalDetector.ISSUES.toTypedArray())
+            .testModes(TestMode.PARTIAL)
+            .run()
+    }
+
+    @Test
+    fun useJavaExperimentalMembersFromJava() {
+        val input = arrayOf(
+            javaSample("sample.kotlin.AnnotatedJavaMembers"),
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.UseJavaExperimentalMembersFromJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:30: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return stableObject.field;
+                            ~~~~~
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:38: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return stableObject.method();
+                            ~~~~~~
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:45: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return AnnotatedJavaMembers.FIELD_STATIC;
+                                    ~~~~~~~~~~~~
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:52: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return AnnotatedJavaMembers.methodStatic();
+                                    ~~~~~~~~~~~~
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:59: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        new AnnotatedJavaMembers().field = -1;
+                                   ~~~~~
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:59: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        new AnnotatedJavaMembers().field = -1;
+                                           ~~
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:60: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        int value = new AnnotatedJavaMembers().field;
+                                               ~~~~~
+src/sample/kotlin/UseJavaExperimentalMembersFromJava.java:61: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        new AnnotatedJavaMembers().setFieldWithSetMarker(-1);
+                                   ~~~~~~~~~~~~~~~~~~~~~
+8 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun useJavaExperimentalClassFromJava() {
+        val input = arrayOf(
+            javaSample("sample.kotlin.AnnotatedJavaClass"),
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.UseJavaExperimentalClassFromJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/UseJavaExperimentalClassFromJava.java:31: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+                                                ~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/UseJavaExperimentalClassFromJava.java:32: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return experimentalObject.field;
+                                  ~~~~~
+src/sample/kotlin/UseJavaExperimentalClassFromJava.java:39: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        AnnotatedJavaClass experimentalObject = new AnnotatedJavaClass();
+                                                ~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/UseJavaExperimentalClassFromJava.java:40: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return experimentalObject.method();
+                                  ~~~~~~
+src/sample/kotlin/UseJavaExperimentalClassFromJava.java:47: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return AnnotatedJavaClass.FIELD_STATIC;
+                                  ~~~~~~~~~~~~
+src/sample/kotlin/UseJavaExperimentalClassFromJava.java:54: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        return AnnotatedJavaClass.methodStatic();
+                                  ~~~~~~~~~~~~
+6 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun useJavaExperimentalMultipleMarkersFromJava() {
+        val input = arrayOf(
+            javaSample("sample.kotlin.AnnotatedJavaClass"),
+            javaSample("sample.kotlin.AnnotatedJavaClass2"),
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation2"),
+            javaSample("sample.kotlin.UseJavaExperimentalMultipleMarkersFromJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/UseJavaExperimentalMultipleMarkersFromJava.java:33: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation2 or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation2.class) [UnsafeOptInUsageError]
+        AnnotatedJavaClass2 experimentalObject2 = new AnnotatedJavaClass2();
+                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/UseJavaExperimentalMultipleMarkersFromJava.java:34: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation2 or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation2.class) [UnsafeOptInUsageError]
+        return experimentalObject.method() + experimentalObject2.field;
+                                                                 ~~~~~
+2 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun useKtExperimentalFromJava() {
+        val input = arrayOf(
+            ktSample("sample.kotlin.AnnotatedKotlinClass"),
+            ktSample("sample.kotlin.AnnotatedKotlinClass2"),
+            ktSample("sample.kotlin.AnnotatedKotlinMembers"),
+            ktSample("sample.kotlin.ExperimentalKotlinAnnotation"),
+            ktSample("sample.kotlin.ExperimentalKotlinAnnotation2"),
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.UseKtExperimentalFromJava")
+        )
+
+        // TODO(b/210881073): Access to annotated property `field` is still not detected.
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/UseKtExperimentalFromJava.java:28: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalKotlinAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class) [UnsafeOptInUsageError]
+        AnnotatedKotlinClass experimentalObject = new AnnotatedKotlinClass();
+                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/UseKtExperimentalFromJava.java:29: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalKotlinAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class) [UnsafeOptInUsageError]
+        return experimentalObject.method();
+                                  ~~~~~~
+src/sample/kotlin/UseKtExperimentalFromJava.java:56: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalKotlinAnnotation2 or @OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation2.class) [UnsafeOptInUsageError]
+        return experimentalObject.method() + AnnotatedKotlinClass2.fieldStatic;
+                                                                   ~~~~~~~~~~~
+src/sample/kotlin/UseKtExperimentalFromJava.java:97: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalKotlinAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class) [UnsafeOptInUsageError]
+        AnnotatedKotlinMembers.methodStatic();
+                               ~~~~~~~~~~~~
+src/sample/kotlin/UseKtExperimentalFromJava.java:98: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalKotlinAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class) [UnsafeOptInUsageError]
+        AnnotatedKotlinMembers.Companion.methodStatic();
+                                         ~~~~~~~~~~~~
+src/sample/kotlin/UseKtExperimentalFromJava.java:107: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalKotlinAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class) [UnsafeOptInUsageError]
+        new AnnotatedKotlinMembers().method();
+                                     ~~~~~~
+src/sample/kotlin/UseKtExperimentalFromJava.java:108: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        new AnnotatedKotlinMembers().methodWithJavaMarker();
+                                     ~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/UseKtExperimentalFromJava.java:117: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalKotlinAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalKotlinAnnotation.class) [UnsafeOptInUsageError]
+        new AnnotatedKotlinMembers().setFieldWithSetMarker(-1);
+                                     ~~~~~~~~~~~~~~~~~~~~~
+8 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun useJavaPackageFromJava() {
+        val input = arrayOf(
+            SAMPLE_FOO_PACKAGE_INFO,
+            javaSample("sample.kotlin.foo.AnnotatedJavaPackage"),
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.UseJavaPackageFromJava")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/UseJavaPackageFromJava.java:32: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        AnnotatedJavaPackage experimentalObject = new AnnotatedJavaPackage();
+                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/UseJavaPackageFromJava.java:33: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        experimentalObject.method();
+                           ~~~~~~
+src/sample/kotlin/UseJavaPackageFromJava.java:66: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        safePropagateMarker();
+        ~~~~~~~~~~~~~~~~~~~
+3 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    /**
+     * Regression test for b/218798815 where the lint check yields false positives on usages within
+     * an annotated package.
+     */
+    @Test
+    fun regressionTestJava218798815() {
+        val input = arrayOf(
+            SAMPLE_FOO_PACKAGE_INFO,
+            javaSample("sample.kotlin.foo.AnnotatedJavaPackage"),
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.foo.RegressionTestJava218798815")
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+No warnings.
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun regressionTestJava193110413() {
+        val input = arrayOf(
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.RegressionTestJava193110413"),
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/RegressionTestJava193110413.java:92: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        foo.defaultExperimentalMethod(); // unsafe in Java but safe in Kotlin
+            ~~~~~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava193110413.java:93: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        foo.experimentalMethod(); // unsafe
+            ~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava193110413.java:95: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        Bar bar = new Bar(); // unsafe
+                  ~~~~~~~~~
+src/sample/kotlin/RegressionTestJava193110413.java:96: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        bar.stableMethodLevelOptIn(); // unsafe due to experimental class scope
+            ~~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava193110413.java:97: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        bar.experimentalMethod(); // unsafe
+            ~~~~~~~~~~~~~~~~~~
+5 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun regressionTestJava192562469() {
+        val input = arrayOf(
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.RegressionTestJava192562469"),
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/RegressionTestJava192562469.java:34: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+    static class ConcreteExperimentalInterface implements ExperimentalInterface { // unsafe
+                                                          ~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava192562469.java:36: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        public void experimentalMethod() {} // unsafe override
+                    ~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava192562469.java:62: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        ExperimentalInterface anonymous = new ExperimentalInterface() { // unsafe
+                                              ~~~~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava192562469.java:64: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+            public void experimentalMethod() {} // unsafe override
+                        ~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava192562469.java:67: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        ExperimentalInterface lambda = () -> {}; // unsafe
+                                       ~~~~~~~~
+5 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    @Test
+    fun regressionTestJava192562926() {
+        val input = arrayOf(
+            javaSample("sample.kotlin.ExperimentalJavaAnnotation"),
+            javaSample("sample.kotlin.RegressionTestJava192562926"),
+        )
+
+        /* ktlint-disable max-line-length */
+        val expected = """
+src/sample/kotlin/RegressionTestJava192562926.java:39: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        public void experimentalMethod() {} // unsafe override
+                    ~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava192562926.java:49: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+            public void experimentalMethod() {} // unsafe override
+                        ~~~~~~~~~~~~~~~~~~
+src/sample/kotlin/RegressionTestJava192562926.java:52: Error: This declaration is opt-in and its usage should be marked with @sample.kotlin.ExperimentalJavaAnnotation or @OptIn(markerClass = sample.kotlin.ExperimentalJavaAnnotation.class) [UnsafeOptInUsageError]
+        StableInterface lambda = () -> {}; // unsafe override
+                                 ~~~~~~~~
+3 errors, 0 warnings
+        """.trimIndent()
+        /* ktlint-enable max-line-length */
+
+        check(*input).expect(expected)
+    }
+
+    /* ktlint-disable max-line-length */
+    companion object {
+        /**
+         * [TestFile] containing RequiresOptIn.kt from the experimental annotation library.
+         *
+         * This is a workaround for IntelliJ failing to recognize source files if they are also
+         * included as resources.
+         */
+        val ANDROIDX_REQUIRES_OPT_IN_KT: TestFile = kotlin(
+            """
+            package androidx.annotation
+
+            import kotlin.annotation.Retention
+            import kotlin.annotation.Target
+
+            @Retention(AnnotationRetention.BINARY)
+            @Target(AnnotationTarget.ANNOTATION_CLASS)
+            annotation class RequiresOptIn(
+                val level: Level = Level.ERROR
+            ) {
+                enum class Level {
+                    WARNING,
+                    ERROR
+                }
+            }
+            """.trimIndent()
+        )
+
+        /**
+         * [TestFile] containing OptIn.kt from the experimental annotation library.
+         *
+         * This is a workaround for IntelliJ failing to recognize source files if they are also
+         * included as resources.
+         */
+        val ANDROIDX_OPT_IN_KT: TestFile = kotlin(
+            """
+            package androidx.annotation
+
+            import kotlin.annotation.Retention
+            import kotlin.annotation.Target
+            import kotlin.reflect.KClass
+
+            @Retention(AnnotationRetention.BINARY)
+            @Target(
+                AnnotationTarget.CLASS,
+                AnnotationTarget.PROPERTY,
+                AnnotationTarget.LOCAL_VARIABLE,
+                AnnotationTarget.VALUE_PARAMETER,
+                AnnotationTarget.CONSTRUCTOR,
+                AnnotationTarget.FUNCTION,
+                AnnotationTarget.PROPERTY_GETTER,
+                AnnotationTarget.PROPERTY_SETTER,
+                AnnotationTarget.FILE,
+                AnnotationTarget.TYPEALIAS
+            )
+            annotation class OptIn(
+                vararg val markerClass: KClass<out Annotation>
+            )
+            """.trimIndent()
+        )
+
+        /**
+         * [TestFile] containing the package-level annotation for the sample.kotlin.foo package.
+         *
+         * This is a workaround for b/136184987 where package-level annotations cannot be loaded
+         * from source code. This is generated from a single-class JAR using toBase64gzip(File).
+         *
+         * To re-generate this:
+         * (if linux). alias pbcopy='xclip -selection clipboard'
+         * 1. ./gradlew :annotation:annotation-experimental-lint-integration-tests:assemble
+         * 2. mkdir -p temp/sample/kotlin/foo/
+         * 3. cp ../../out/androidx/annotation/annotation-experimental-lint-integration-tests/build/intermediates/javac/debug/classes/sample/kotlin/foo/package-info.class temp/sample/kotlin/foo/
+         * 4. jar -c -f sample.kotlin.foo.package-info.jar -C temp .; openssl base64 < sample.kotlin.foo.package-info.jar | tr -d '\n' | pbcopy
+         * 5. Paste below
+         * 6. rm -rf temp sample.kotlin.foo.package-info.jar
+         */
+        val SAMPLE_FOO_PACKAGE_INFO: TestFile = base64gzip(
+            "libs/sample.kotlin.foo.package-info.jar",
+            "UEsDBBQACAgIAJZj/VQAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMAUEsHCAAAAAACAAAAAAAAAFBLAwQUAAgICACWY/1UAAAAAAAAAAAAAAAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1G803My0xLLS7RDUstKs7Mz7NSMNQz4OVyLkpNLElN0XWqBAoARfQMjRU03PPz03NSFTzzkvU0ebl4uQBQSwcIk36TrzsAAAA8AAAAUEsDBAoAAAgAAJBj/VQAAAAAAAAAAAAAAAAHAAAAc2FtcGxlL1BLAwQKAAAIAACQY/1UAAAAAAAAAAAAAAAADgAAAHNhbXBsZS9rb3RsaW4vUEsDBAoAAAgAAJNj/VQAAAAAAAAAAAAAAAASAAAAc2FtcGxlL2tvdGxpbi9mb28vUEsDBBQACAgIAJNj/VQAAAAAAAAAAAAAAAAkAAAAc2FtcGxlL2tvdGxpbi9mb28vcGFja2FnZS1pbmZvLmNsYXNzVY09CsJAFIRn40/UShsbwQMIuo2dlYWCIgh6gpewCZts3oZkEzybhQfwUGLUQp1ipphvmPvjegOwRN+H76MnMDjbqgjVVhslMMopTClWc82RXSRUk8DkVLHTmdpxrUsdGLVmto6ctlwKzA4lZblRMrXOaJabS66KhmZHZt/sv/BKYPrPRtbK30OB4etSGuJYHoNEhW4MCHj4yEPr7W10muw2TRd4AlBLBwhDTi5bpgAAANIAAABQSwECFAAUAAgICACWY/1UAAAAAAIAAAAAAAAACQAEAAAAAAAAAAAAAAAAAAAATUVUQS1JTkYv/soAAFBLAQIUABQACAgIAJZj/VSTfpOvOwAAADwAAAAUAAAAAAAAAAAAAAAAAD0AAABNRVRBLUlORi9NQU5JRkVTVC5NRlBLAQIKAAoAAAgAAJBj/VQAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAALoAAABzYW1wbGUvUEsBAgoACgAACAAAkGP9VAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAA3wAAAHNhbXBsZS9rb3RsaW4vUEsBAgoACgAACAAAk2P9VAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAACwEAAHNhbXBsZS9rb3RsaW4vZm9vL1BLAQIUABQACAgIAJNj/VRDTi5bpgAAANIAAAAkAAAAAAAAAAAAAAAAADsBAABzYW1wbGUva290bGluL2Zvby9wYWNrYWdlLWluZm8uY2xhc3NQSwUGAAAAAAYABgCAAQAAMwIAAAAA"
+        )
+    }
+    /* ktlint-enable max-line-length */
+}
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt
index 463c143..5a2bcf3 100644
--- a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/RequiresOptInDetectorTest.kt
@@ -20,7 +20,6 @@
 
 import com.android.tools.lint.checks.infrastructure.TestFile
 import com.android.tools.lint.checks.infrastructure.TestFiles.base64gzip
-import com.android.tools.lint.checks.infrastructure.TestFiles.java
 import com.android.tools.lint.checks.infrastructure.TestFiles.kotlin
 import com.android.tools.lint.checks.infrastructure.TestLintResult
 import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
@@ -538,25 +537,3 @@
     }
     /* ktlint-enable max-line-length */
 }
-
-/**
- * Loads a [TestFile] from Java source code included in the JAR resources.
- */
-fun javaSample(className: String): TestFile {
-    return java(
-        RequiresOptInDetectorTest::class.java.getResource(
-            "/java/${className.replace('.','/')}.java"
-        )!!.readText()
-    )
-}
-
-/**
- * Loads a [TestFile] from Kotlin source code included in the JAR resources.
- */
-fun ktSample(className: String): TestFile {
-    return kotlin(
-        RequiresOptInDetectorTest::class.java.getResource(
-            "/java/${className.replace('.','/')}.kt"
-        )!!.readText()
-    )
-}
\ No newline at end of file
diff --git a/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/TestUtils.kt b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/TestUtils.kt
new file mode 100644
index 0000000..33989a9
--- /dev/null
+++ b/annotation/annotation-experimental-lint/src/test/kotlin/androidx/annotation/experimental/lint/TestUtils.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.annotation.experimental.lint
+
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestFiles
+
+/**
+ * Loads a [TestFile] from Java source code included in the JAR resources.
+ */
+fun javaSample(className: String): TestFile {
+    return TestFiles.java(
+        RequiresOptInDetectorTest::class.java.getResource(
+            "/java/${className.replace('.', '/')}.java"
+        )!!.readText()
+    )
+}
+
+/**
+ * Loads a [TestFile] from Kotlin source code included in the JAR resources.
+ */
+fun ktSample(className: String): TestFile {
+    return TestFiles.kotlin(
+        RequiresOptInDetectorTest::class.java.getResource(
+            "/java/${className.replace('.', '/')}.kt"
+        )!!.readText()
+    )
+}
\ No newline at end of file
diff --git a/appcompat/appcompat-lint/integration-tests/lint-baseline.xml b/appcompat/appcompat-lint/integration-tests/lint-baseline.xml
index a4b89aa..55f0f27 100644
--- a/appcompat/appcompat-lint/integration-tests/lint-baseline.xml
+++ b/appcompat/appcompat-lint/integration-tests/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -52,8 +52,7 @@
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="                         ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/AppCompatLintDemoExt.java"
-            column="26"/>
+            file="src/main/java/com/example/android/appcompat/AppCompatLintDemoExt.java"/>
     </issue>
 
     <issue
@@ -62,9 +61,7 @@
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="            ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CoreActivityExt.java"
-            line="34"
-            column="13"/>
+            file="src/main/java/com/example/android/appcompat/CoreActivityExt.java"/>
     </issue>
 
     <issue
@@ -73,9 +70,7 @@
         errorLine1="            setActionBar(new Toolbar(this));"
         errorLine2="                         ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CoreActivityExt.java"
-            line="34"
-            column="26"/>
+            file="src/main/java/com/example/android/appcompat/CoreActivityExt.java"/>
     </issue>
 
     <issue
@@ -84,9 +79,7 @@
         errorLine1="    &lt;item app:alpha=&quot;?android:disabledAlpha&quot;"
         errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/color/color_state_list_missing_android_alpha.xml"
-            line="19"
-            column="11"/>
+            file="src/main/res/color/color_state_list_missing_android_alpha.xml"/>
     </issue>
 
     <issue
@@ -95,9 +88,7 @@
         errorLine1="        android:tint=&quot;#FF0000&quot; />"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/layout/image_view_using_android_tint.xml"
-            line="39"
-            column="9"/>
+            file="src/main/res/layout/image_view_using_android_tint.xml"/>
     </issue>
 
     <issue
@@ -106,31 +97,7 @@
         errorLine1="        android:tint=&quot;#FF0000&quot; />"
         errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/res/layout/image_view_using_android_tint.xml"
-            line="51"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ResourceLoader` requires synthetic accessor"
-        errorLine1="        ColorStateList csl2 = new ResourceLoader().getColorStateList("
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/appcompat/AppCompatLintDemo.java"
-            line="54"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `getColorStateList` of class `ResourceLoader` requires synthetic accessor"
-        errorLine1="        ColorStateList csl2 = new ResourceLoader().getColorStateList("
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/appcompat/AppCompatLintDemo.java"
-            line="54"
-            column="31"/>
+            file="src/main/res/layout/image_view_using_android_tint.xml"/>
     </issue>
 
     <issue
@@ -139,9 +106,7 @@
         errorLine1="    public void myButtonClick(View view) {"
         errorLine2="                              ~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/ActivityWithClick.java"
-            line="39"
-            column="31"/>
+            file="src/main/java/com/example/android/appcompat/ActivityWithClick.java"/>
     </issue>
 
     <issue
@@ -150,9 +115,7 @@
         errorLine1="    public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/AppCompatLintDemo.java"
-            line="42"
-            column="26"/>
+            file="src/main/java/com/example/android/appcompat/AppCompatLintDemo.java"/>
     </issue>
 
     <issue
@@ -161,9 +124,7 @@
         errorLine1="    public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/AppCompatLintDemoExt.java"
-            line="28"
-            column="26"/>
+            file="src/main/java/com/example/android/appcompat/AppCompatLintDemoExt.java"/>
     </issue>
 
     <issue
@@ -172,9 +133,7 @@
         errorLine1="    public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CoreActivityExt.java"
-            line="29"
-            column="26"/>
+            file="src/main/java/com/example/android/appcompat/CoreActivityExt.java"/>
     </issue>
 
     <issue
@@ -183,9 +142,7 @@
         errorLine1="    public CustomSwitch(Context context) {"
         errorLine2="                        ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"
-            line="28"
-            column="25"/>
+            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"/>
     </issue>
 
     <issue
@@ -194,9 +151,7 @@
         errorLine1="    public CustomSwitch(Context context, AttributeSet attrs) {"
         errorLine2="                        ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"
-            line="32"
-            column="25"/>
+            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"/>
     </issue>
 
     <issue
@@ -205,9 +160,7 @@
         errorLine1="    public CustomSwitch(Context context, AttributeSet attrs) {"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"
-            line="32"
-            column="42"/>
+            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"/>
     </issue>
 
     <issue
@@ -216,9 +169,7 @@
         errorLine1="    public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) {"
         errorLine2="                        ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"
-            line="36"
-            column="25"/>
+            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"/>
     </issue>
 
     <issue
@@ -227,9 +178,7 @@
         errorLine1="    public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) {"
         errorLine2="                                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"
-            line="36"
-            column="42"/>
+            file="src/main/java/com/example/android/appcompat/CustomSwitch.java"/>
     </issue>
 
 </issues>
diff --git a/appcompat/appcompat-resources/api/1.6.0-beta01.txt b/appcompat/appcompat-resources/api/1.6.0-beta01.txt
new file mode 100644
index 0000000..0d2a788
--- /dev/null
+++ b/appcompat/appcompat-resources/api/1.6.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class AnimatedStateListDrawableCompat extends androidx.appcompat.graphics.drawable.StateListDrawableCompat {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+  public class DrawableContainerCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableContainerCompat();
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setEnterFadeDuration(int);
+    method public void setExitFadeDuration(int);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+  }
+
+  public class DrawableWrapperCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableWrapperCompat(android.graphics.drawable.Drawable!);
+    method public void draw(android.graphics.Canvas!);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setDrawable(android.graphics.drawable.Drawable?);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+  }
+
+  public class StateListDrawableCompat extends androidx.appcompat.graphics.drawable.DrawableContainerCompat {
+    ctor public StateListDrawableCompat();
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/public_plus_experimental_1.6.0-beta01.txt b/appcompat/appcompat-resources/api/public_plus_experimental_1.6.0-beta01.txt
new file mode 100644
index 0000000..0d2a788
--- /dev/null
+++ b/appcompat/appcompat-resources/api/public_plus_experimental_1.6.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class AnimatedStateListDrawableCompat extends androidx.appcompat.graphics.drawable.StateListDrawableCompat {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+  public class DrawableContainerCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableContainerCompat();
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setEnterFadeDuration(int);
+    method public void setExitFadeDuration(int);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+  }
+
+  public class DrawableWrapperCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableWrapperCompat(android.graphics.drawable.Drawable!);
+    method public void draw(android.graphics.Canvas!);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setDrawable(android.graphics.drawable.Drawable?);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+  }
+
+  public class StateListDrawableCompat extends androidx.appcompat.graphics.drawable.DrawableContainerCompat {
+    ctor public StateListDrawableCompat();
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/res-1.6.0-beta01.txt b/appcompat/appcompat-resources/api/res-1.6.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/appcompat/appcompat-resources/api/res-1.6.0-beta01.txt
diff --git a/appcompat/appcompat-resources/api/restricted_1.6.0-beta01.txt b/appcompat/appcompat-resources/api/restricted_1.6.0-beta01.txt
new file mode 100644
index 0000000..d998c06
--- /dev/null
+++ b/appcompat/appcompat-resources/api/restricted_1.6.0-beta01.txt
@@ -0,0 +1,111 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class AnimatedStateListDrawableCompat extends androidx.appcompat.graphics.drawable.StateListDrawableCompat implements androidx.core.graphics.drawable.TintAwareDrawable {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+    method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+  public class DrawableContainerCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableContainerCompat();
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setEnterFadeDuration(int);
+    method public void setExitFadeDuration(int);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+  }
+
+  public class DrawableWrapperCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableWrapperCompat(android.graphics.drawable.Drawable!);
+    method public void draw(android.graphics.Canvas!);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public int getOpacity();
+    method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+    method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDither(boolean);
+    method public void setDrawable(android.graphics.drawable.Drawable?);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+  }
+
+  public class StateListDrawableCompat extends androidx.appcompat.graphics.drawable.DrawableContainerCompat {
+    ctor public StateListDrawableCompat();
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableUtils {
+    method public static boolean canSafelyMutateDrawable(android.graphics.drawable.Drawable);
+    method public static android.graphics.Rect getOpticalBounds(android.graphics.drawable.Drawable);
+    method public static android.graphics.PorterDuff.Mode! parseTintMode(int, android.graphics.PorterDuff.Mode!);
+    field public static final android.graphics.Rect! INSETS_NONE;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ResourceManagerInternal {
+    ctor public ResourceManagerInternal();
+    method public static androidx.appcompat.widget.ResourceManagerInternal! get();
+    method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+    method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+    method public void onConfigurationChanged(android.content.Context);
+    method public void setHooks(androidx.appcompat.widget.ResourceManagerInternal.ResourceManagerHooks!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ResourceManagerInternal.ResourceManagerHooks {
+    method public android.graphics.drawable.Drawable? createDrawableFor(androidx.appcompat.widget.ResourceManagerInternal, android.content.Context, @DrawableRes int);
+    method public android.content.res.ColorStateList? getTintListForDrawableRes(android.content.Context, @DrawableRes int);
+    method public android.graphics.PorterDuff.Mode? getTintModeForDrawableRes(int);
+    method public boolean tintDrawable(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+    method public boolean tintDrawableUsingColorFilter(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintContextWrapper extends android.content.ContextWrapper {
+    method public static android.content.Context! wrap(android.content.Context);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintInfo {
+    ctor public TintInfo();
+    field public boolean mHasTintList;
+    field public boolean mHasTintMode;
+    field public android.content.res.ColorStateList! mTintList;
+    field public android.graphics.PorterDuff.Mode! mTintMode;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class VectorEnabledTintResources extends android.content.res.Resources {
+    ctor public VectorEnabledTintResources(android.content.Context, android.content.res.Resources);
+    method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+    method public android.content.res.ColorStateList! getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+    method public android.graphics.drawable.Drawable! getDrawable(int) throws android.content.res.Resources.NotFoundException;
+    method @RequiresApi(15) public android.graphics.drawable.Drawable! getDrawableForDensity(int, int) throws android.content.res.Resources.NotFoundException;
+    method public android.graphics.Movie! getMovie(int) throws android.content.res.Resources.NotFoundException;
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public static boolean shouldBeUsed();
+    method public void updateConfiguration(android.content.res.Configuration!, android.util.DisplayMetrics!);
+    field public static final int MAX_SDK_WHERE_REQUIRED = 20; // 0x14
+  }
+
+}
+
diff --git a/appcompat/appcompat/api/1.6.0-beta01.txt b/appcompat/appcompat/api/1.6.0-beta01.txt
new file mode 100644
index 0000000..0219b45
--- /dev/null
+++ b/appcompat/appcompat/api/1.6.0-beta01.txt
@@ -0,0 +1,1063 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public abstract android.view.View! getCustomView();
+    method public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method @Deprecated public abstract int getNavigationItemCount();
+    method @Deprecated public abstract int getNavigationMode();
+    method @Deprecated public abstract int getSelectedNavigationIndex();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+    method public abstract CharSequence? getSubtitle();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method @Deprecated public abstract int getTabCount();
+    method public android.content.Context! getThemedContext();
+    method public abstract CharSequence? getTitle();
+    method public abstract void hide();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+    method @Deprecated public abstract void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void removeTabAt(int);
+    method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public abstract void setCustomView(int);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(int);
+    method public abstract void setDisplayOptions(int, int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(CharSequence?);
+    method public void setHomeActionContentDescription(@StringRes int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+    method public void setHomeAsUpIndicator(@DrawableRes int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(@DrawableRes int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public abstract void setLogo(@DrawableRes int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setNavigationMode(int);
+    method @Deprecated public abstract void setSelectedNavigationItem(int);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(@StringRes int);
+    method public abstract void show();
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    field public int gravity;
+  }
+
+  public static interface ActionBar.OnMenuVisibilityListener {
+    method public void onMenuVisibilityChanged(boolean);
+  }
+
+  @Deprecated public static interface ActionBar.OnNavigationListener {
+    method @Deprecated public boolean onNavigationItemSelected(int, long);
+  }
+
+  @Deprecated public abstract static class ActionBar.Tab {
+    ctor @Deprecated public ActionBar.Tab();
+    method @Deprecated public abstract CharSequence! getContentDescription();
+    method @Deprecated public abstract android.view.View! getCustomView();
+    method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+    method @Deprecated public abstract int getPosition();
+    method @Deprecated public abstract Object! getTag();
+    method @Deprecated public abstract CharSequence! getText();
+    method @Deprecated public abstract void select();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+    field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  @Deprecated public static interface ActionBar.TabListener {
+    method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+  }
+
+  public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+    method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDrawerClosed(android.view.View!);
+    method public void onDrawerOpened(android.view.View!);
+    method public void onDrawerSlide(android.view.View!, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem!);
+    method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+    method public void syncState();
+  }
+
+  public static interface ActionBarDrawerToggle.Delegate {
+    method public android.content.Context! getActionBarThemedContext();
+    method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+    method public boolean isNavigationVisible();
+    method public void setActionBarDescription(@StringRes int);
+    method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+  }
+
+  public static interface ActionBarDrawerToggle.DelegateProvider {
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, @StyleRes int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public android.widget.Button! getButton(int);
+    method public android.widget.ListView! getListView();
+    method public void setButton(int, CharSequence!, android.os.Message!);
+    method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+    method public void setCustomTitle(android.view.View!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setIconAttribute(int);
+    method public void setMessage(CharSequence!);
+    method public void setView(android.view.View!);
+    method public void setView(android.view.View!, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+    method public androidx.appcompat.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+    method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+    method public androidx.appcompat.app.AlertDialog! show();
+  }
+
+  public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    ctor @ContentView public AppCompatActivity(@LayoutRes int);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public android.content.Intent? getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method protected void onLocalesChanged(androidx.core.os.LocaleListCompat);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method protected void onNightModeChanged(int);
+    method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+    method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+    method @Deprecated public void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method @Deprecated public void setSupportProgress(int);
+    method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+    method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+    method @Deprecated public void setSupportProgressBarVisibility(boolean);
+    method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void supportInvalidateOptionsMenu();
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public interface AppCompatCallback {
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public abstract boolean applyDayNight();
+    method @Deprecated public void attachBaseContext(android.content.Context!);
+    method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+    method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+    method @AnyThread public static androidx.core.os.LocaleListCompat getApplicationLocales();
+    method public android.content.Context? getContextForDelegate();
+    method public static int getDefaultNightMode();
+    method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public int getLocalNightMode();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+    method public abstract void onCreate(android.os.Bundle!);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle!);
+    method public abstract void onPostResume();
+    method public abstract void onSaveInstanceState(android.os.Bundle!);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setApplicationLocales(androidx.core.os.LocaleListCompat);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public abstract void setContentView(android.view.View!);
+    method public abstract void setContentView(@LayoutRes int);
+    method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public static void setDefaultNightMode(int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method @RequiresApi(17) public abstract void setLocalNightMode(int);
+    method @CallSuper @RequiresApi(33) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher?);
+    method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method public void setTheme(@StyleRes int);
+    method public abstract void setTitle(CharSequence?);
+    method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+    field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+    field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  public class AppCompatDialog extends androidx.activity.ComponentDialog implements androidx.appcompat.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+    ctor public AppCompatDialogFragment(@LayoutRes int);
+  }
+
+  public class AppCompatViewInflater {
+    ctor public AppCompatViewInflater();
+    method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+    method public final android.view.View? createView(android.view.View?, String, android.content.Context, android.util.AttributeSet, boolean, boolean, boolean, boolean);
+    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+  public final class AppLocalesMetadataHolderService extends android.app.Service {
+    ctor public AppLocalesMetadataHolderService();
+    method public static android.content.pm.ServiceInfo getServiceInfo(android.content.Context) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context!);
+    method public void draw(android.graphics.Canvas!);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method @ColorInt public int getColor();
+    method public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint! getPaint();
+    method @FloatRange(from=0.0, to=1.0) public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(@ColorInt int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDirection(int);
+    method public void setGapSize(float);
+    method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+}
+
+package androidx.appcompat.view {
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View! getCustomView();
+    method public abstract android.view.Menu! getMenu();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract CharSequence! getSubtitle();
+    method public Object! getTag();
+    method public abstract CharSequence! getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public void setTag(Object!);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static interface ActionMode.Callback {
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @Deprecated public interface CollapsibleActionView {
+    method @Deprecated public void onActionViewCollapsed();
+    method @Deprecated public void onActionViewExpanded();
+  }
+
+  public class ContextThemeWrapper extends android.content.ContextWrapper {
+    ctor public ContextThemeWrapper();
+    ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+    ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+    method public void applyOverrideConfiguration(android.content.res.Configuration!);
+    method public int getThemeResId();
+    method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public android.view.Menu! getMenu();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method public boolean hideOverflowMenu();
+    method public boolean isOverflowMenuShowing();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDetachedFromWindow();
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static interface ActionMenuView.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setSupportAllCaps(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatRadioButton(android.content.Context!);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+    method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+    method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+  }
+
+  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatToggleButton(android.content.Context);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+    method public void setDividerPadding(int);
+    method public void setGravity(@GravityInt int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(int);
+    method public void setShowDividers(int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  public class ListPopupWindow {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+    method public void dismiss();
+    method public android.view.View? getAnchorView();
+    method @StyleRes public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable? getBackground();
+    method public android.graphics.Rect? getEpicenterBounds();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView? getListView();
+    method public int getPromptPosition();
+    method public Object? getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View? getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter?);
+    method public void setAnchorView(android.view.View?);
+    method public void setAnimationStyle(@StyleRes int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setContentWidth(int);
+    method public void setDropDownGravity(int);
+    method public void setEpicenterBounds(android.graphics.Rect?);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable!);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View?);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(@MenuRes int);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+    method public void show();
+  }
+
+  public static interface PopupMenu.OnDismissListener {
+    method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+  }
+
+  public static interface PopupMenu.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+    method public int getInputType();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method protected void onQueryRefine(CharSequence?);
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+    method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+    method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+    method public void setQuery(CharSequence!, boolean);
+    method public void setQueryHint(CharSequence?);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo!);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+  }
+
+  public static interface SearchView.OnCloseListener {
+    method public boolean onClose();
+  }
+
+  public static interface SearchView.OnQueryTextListener {
+    method public boolean onQueryTextChange(String!);
+    method public boolean onQueryTextSubmit(String!);
+  }
+
+  public static interface SearchView.OnSuggestionListener {
+    method public boolean onSuggestionClick(int);
+    method public boolean onSuggestionSelect(int);
+  }
+
+  public class ShareActionProvider extends androidx.core.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context!);
+    method public android.view.View! onCreateActionView();
+    method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+    method public void setShareHistoryFileName(String!);
+    method public void setShareIntent(android.content.Intent!);
+    field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @FloatRange(from=0.0, to=1.0) protected final float getThumbPosition();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
+    method protected final void setEnforceSwitchWidth(boolean);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!);
+    method public void setTextOff(CharSequence!);
+    method public void setTextOn(CharSequence!);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setThumbTintList(android.content.res.ColorStateList?);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList?);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+    ctor public Toolbar(android.content.Context);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
+    method public boolean isBackInvokedCallbackEnabled();
+    method public boolean isOverflowMenuShowing();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public void setBackInvokedCallbackEnabled(boolean);
+    method public void setCollapseContentDescription(@StringRes int);
+    method public void setCollapseContentDescription(CharSequence?);
+    method public void setCollapseIcon(@DrawableRes int);
+    method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(@DrawableRes int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setLogoDescription(@StringRes int);
+    method public void setLogoDescription(CharSequence!);
+    method public void setNavigationContentDescription(@StringRes int);
+    method public void setNavigationContentDescription(CharSequence?);
+    method public void setNavigationIcon(@DrawableRes int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public void setSubtitle(@StringRes int);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setSubtitleTextColor(@ColorInt int);
+    method public void setSubtitleTextColor(android.content.res.ColorStateList);
+    method public void setTitle(@StringRes int);
+    method public void setTitle(CharSequence!);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
+    method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setTitleTextColor(@ColorInt int);
+    method public void setTitleTextColor(android.content.res.ColorStateList);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+  }
+
+  public static interface Toolbar.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel!);
+    ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+    ctor public Toolbar.SavedState(android.os.Parcelable!);
+    field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, CharSequence?);
+  }
+
+}
+
diff --git a/appcompat/appcompat/api/public_plus_experimental_1.6.0-beta01.txt b/appcompat/appcompat/api/public_plus_experimental_1.6.0-beta01.txt
new file mode 100644
index 0000000..0219b45
--- /dev/null
+++ b/appcompat/appcompat/api/public_plus_experimental_1.6.0-beta01.txt
@@ -0,0 +1,1063 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public abstract android.view.View! getCustomView();
+    method public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method @Deprecated public abstract int getNavigationItemCount();
+    method @Deprecated public abstract int getNavigationMode();
+    method @Deprecated public abstract int getSelectedNavigationIndex();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+    method public abstract CharSequence? getSubtitle();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method @Deprecated public abstract int getTabCount();
+    method public android.content.Context! getThemedContext();
+    method public abstract CharSequence? getTitle();
+    method public abstract void hide();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+    method @Deprecated public abstract void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void removeTabAt(int);
+    method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public abstract void setCustomView(int);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(int);
+    method public abstract void setDisplayOptions(int, int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(CharSequence?);
+    method public void setHomeActionContentDescription(@StringRes int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+    method public void setHomeAsUpIndicator(@DrawableRes int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(@DrawableRes int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public abstract void setLogo(@DrawableRes int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setNavigationMode(int);
+    method @Deprecated public abstract void setSelectedNavigationItem(int);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(@StringRes int);
+    method public abstract void show();
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    field public int gravity;
+  }
+
+  public static interface ActionBar.OnMenuVisibilityListener {
+    method public void onMenuVisibilityChanged(boolean);
+  }
+
+  @Deprecated public static interface ActionBar.OnNavigationListener {
+    method @Deprecated public boolean onNavigationItemSelected(int, long);
+  }
+
+  @Deprecated public abstract static class ActionBar.Tab {
+    ctor @Deprecated public ActionBar.Tab();
+    method @Deprecated public abstract CharSequence! getContentDescription();
+    method @Deprecated public abstract android.view.View! getCustomView();
+    method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+    method @Deprecated public abstract int getPosition();
+    method @Deprecated public abstract Object! getTag();
+    method @Deprecated public abstract CharSequence! getText();
+    method @Deprecated public abstract void select();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+    field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  @Deprecated public static interface ActionBar.TabListener {
+    method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+  }
+
+  public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+    method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDrawerClosed(android.view.View!);
+    method public void onDrawerOpened(android.view.View!);
+    method public void onDrawerSlide(android.view.View!, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem!);
+    method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+    method public void syncState();
+  }
+
+  public static interface ActionBarDrawerToggle.Delegate {
+    method public android.content.Context! getActionBarThemedContext();
+    method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+    method public boolean isNavigationVisible();
+    method public void setActionBarDescription(@StringRes int);
+    method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+  }
+
+  public static interface ActionBarDrawerToggle.DelegateProvider {
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, @StyleRes int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public android.widget.Button! getButton(int);
+    method public android.widget.ListView! getListView();
+    method public void setButton(int, CharSequence!, android.os.Message!);
+    method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+    method public void setCustomTitle(android.view.View!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setIconAttribute(int);
+    method public void setMessage(CharSequence!);
+    method public void setView(android.view.View!);
+    method public void setView(android.view.View!, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+    method public androidx.appcompat.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+    method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+    method public androidx.appcompat.app.AlertDialog! show();
+  }
+
+  public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    ctor @ContentView public AppCompatActivity(@LayoutRes int);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public android.content.Intent? getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method protected void onLocalesChanged(androidx.core.os.LocaleListCompat);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method protected void onNightModeChanged(int);
+    method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+    method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+    method @Deprecated public void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method @Deprecated public void setSupportProgress(int);
+    method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+    method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+    method @Deprecated public void setSupportProgressBarVisibility(boolean);
+    method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void supportInvalidateOptionsMenu();
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public interface AppCompatCallback {
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public abstract boolean applyDayNight();
+    method @Deprecated public void attachBaseContext(android.content.Context!);
+    method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+    method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+    method @AnyThread public static androidx.core.os.LocaleListCompat getApplicationLocales();
+    method public android.content.Context? getContextForDelegate();
+    method public static int getDefaultNightMode();
+    method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public int getLocalNightMode();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+    method public abstract void onCreate(android.os.Bundle!);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle!);
+    method public abstract void onPostResume();
+    method public abstract void onSaveInstanceState(android.os.Bundle!);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setApplicationLocales(androidx.core.os.LocaleListCompat);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public abstract void setContentView(android.view.View!);
+    method public abstract void setContentView(@LayoutRes int);
+    method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public static void setDefaultNightMode(int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method @RequiresApi(17) public abstract void setLocalNightMode(int);
+    method @CallSuper @RequiresApi(33) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher?);
+    method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method public void setTheme(@StyleRes int);
+    method public abstract void setTitle(CharSequence?);
+    method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+    field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+    field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  public class AppCompatDialog extends androidx.activity.ComponentDialog implements androidx.appcompat.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+    ctor public AppCompatDialogFragment(@LayoutRes int);
+  }
+
+  public class AppCompatViewInflater {
+    ctor public AppCompatViewInflater();
+    method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+    method public final android.view.View? createView(android.view.View?, String, android.content.Context, android.util.AttributeSet, boolean, boolean, boolean, boolean);
+    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+  public final class AppLocalesMetadataHolderService extends android.app.Service {
+    ctor public AppLocalesMetadataHolderService();
+    method public static android.content.pm.ServiceInfo getServiceInfo(android.content.Context) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context!);
+    method public void draw(android.graphics.Canvas!);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method @ColorInt public int getColor();
+    method public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint! getPaint();
+    method @FloatRange(from=0.0, to=1.0) public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(@ColorInt int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDirection(int);
+    method public void setGapSize(float);
+    method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+}
+
+package androidx.appcompat.view {
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View! getCustomView();
+    method public abstract android.view.Menu! getMenu();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract CharSequence! getSubtitle();
+    method public Object! getTag();
+    method public abstract CharSequence! getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public void setTag(Object!);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static interface ActionMode.Callback {
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @Deprecated public interface CollapsibleActionView {
+    method @Deprecated public void onActionViewCollapsed();
+    method @Deprecated public void onActionViewExpanded();
+  }
+
+  public class ContextThemeWrapper extends android.content.ContextWrapper {
+    ctor public ContextThemeWrapper();
+    ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+    ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+    method public void applyOverrideConfiguration(android.content.res.Configuration!);
+    method public int getThemeResId();
+    method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public android.view.Menu! getMenu();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method public boolean hideOverflowMenu();
+    method public boolean isOverflowMenuShowing();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDetachedFromWindow();
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static interface ActionMenuView.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setSupportAllCaps(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatRadioButton(android.content.Context!);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+    method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+    method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+  }
+
+  public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatToggleButton(android.content.Context);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+    method public void setDividerPadding(int);
+    method public void setGravity(@GravityInt int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(int);
+    method public void setShowDividers(int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  public class ListPopupWindow {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+    method public void dismiss();
+    method public android.view.View? getAnchorView();
+    method @StyleRes public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable? getBackground();
+    method public android.graphics.Rect? getEpicenterBounds();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView? getListView();
+    method public int getPromptPosition();
+    method public Object? getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View? getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter?);
+    method public void setAnchorView(android.view.View?);
+    method public void setAnimationStyle(@StyleRes int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setContentWidth(int);
+    method public void setDropDownGravity(int);
+    method public void setEpicenterBounds(android.graphics.Rect?);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable!);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View?);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(@MenuRes int);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+    method public void show();
+  }
+
+  public static interface PopupMenu.OnDismissListener {
+    method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+  }
+
+  public static interface PopupMenu.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+    method public int getInputType();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method protected void onQueryRefine(CharSequence?);
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+    method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+    method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+    method public void setQuery(CharSequence!, boolean);
+    method public void setQueryHint(CharSequence?);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo!);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+  }
+
+  public static interface SearchView.OnCloseListener {
+    method public boolean onClose();
+  }
+
+  public static interface SearchView.OnQueryTextListener {
+    method public boolean onQueryTextChange(String!);
+    method public boolean onQueryTextSubmit(String!);
+  }
+
+  public static interface SearchView.OnSuggestionListener {
+    method public boolean onSuggestionClick(int);
+    method public boolean onSuggestionSelect(int);
+  }
+
+  public class ShareActionProvider extends androidx.core.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context!);
+    method public android.view.View! onCreateActionView();
+    method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+    method public void setShareHistoryFileName(String!);
+    method public void setShareIntent(android.content.Intent!);
+    field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @FloatRange(from=0.0, to=1.0) protected final float getThumbPosition();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
+    method protected final void setEnforceSwitchWidth(boolean);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!);
+    method public void setTextOff(CharSequence!);
+    method public void setTextOn(CharSequence!);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setThumbTintList(android.content.res.ColorStateList?);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList?);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+    ctor public Toolbar(android.content.Context);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
+    method public boolean isBackInvokedCallbackEnabled();
+    method public boolean isOverflowMenuShowing();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public void setBackInvokedCallbackEnabled(boolean);
+    method public void setCollapseContentDescription(@StringRes int);
+    method public void setCollapseContentDescription(CharSequence?);
+    method public void setCollapseIcon(@DrawableRes int);
+    method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(@DrawableRes int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setLogoDescription(@StringRes int);
+    method public void setLogoDescription(CharSequence!);
+    method public void setNavigationContentDescription(@StringRes int);
+    method public void setNavigationContentDescription(CharSequence?);
+    method public void setNavigationIcon(@DrawableRes int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public void setSubtitle(@StringRes int);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setSubtitleTextColor(@ColorInt int);
+    method public void setSubtitleTextColor(android.content.res.ColorStateList);
+    method public void setTitle(@StringRes int);
+    method public void setTitle(CharSequence!);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
+    method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setTitleTextColor(@ColorInt int);
+    method public void setTitleTextColor(android.content.res.ColorStateList);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+  }
+
+  public static interface Toolbar.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel!);
+    ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+    ctor public Toolbar.SavedState(android.os.Parcelable!);
+    field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, CharSequence?);
+  }
+
+}
+
diff --git a/appcompat/appcompat/api/res-1.6.0-beta01.txt b/appcompat/appcompat/api/res-1.6.0-beta01.txt
new file mode 100644
index 0000000..b9f58a8
--- /dev/null
+++ b/appcompat/appcompat/api/res-1.6.0-beta01.txt
@@ -0,0 +1,369 @@
+attr actionBarDivider
+attr actionBarItemBackground
+attr actionBarPopupTheme
+attr actionBarSize
+attr actionBarSplitStyle
+attr actionBarStyle
+attr actionBarTabBarStyle
+attr actionBarTabStyle
+attr actionBarTabTextStyle
+attr actionBarTheme
+attr actionBarWidgetTheme
+attr actionButtonStyle
+attr actionDropDownStyle
+attr actionLayout
+attr actionMenuTextAppearance
+attr actionMenuTextColor
+attr actionModeBackground
+attr actionModeCloseButtonStyle
+attr actionModeCloseContentDescription
+attr actionModeCloseDrawable
+attr actionModeCopyDrawable
+attr actionModeCutDrawable
+attr actionModeFindDrawable
+attr actionModePasteDrawable
+attr actionModeSelectAllDrawable
+attr actionModeShareDrawable
+attr actionModeSplitBackground
+attr actionModeStyle
+attr actionModeTheme
+attr actionModeWebSearchDrawable
+attr actionOverflowButtonStyle
+attr actionOverflowMenuStyle
+attr actionProviderClass
+attr actionViewClass
+attr alertDialogStyle
+attr alertDialogTheme
+attr arrowHeadLength
+attr arrowShaftLength
+attr autoCompleteTextViewStyle
+attr autoSizeMaxTextSize
+attr autoSizeMinTextSize
+attr autoSizePresetSizes
+attr autoSizeStepGranularity
+attr autoSizeTextType
+attr background
+attr backgroundSplit
+attr backgroundStacked
+attr backgroundTint
+attr backgroundTintMode
+attr barLength
+attr borderlessButtonStyle
+attr buttonBarButtonStyle
+attr buttonBarNegativeButtonStyle
+attr buttonBarNeutralButtonStyle
+attr buttonBarPositiveButtonStyle
+attr buttonBarStyle
+attr buttonGravity
+attr buttonStyle
+attr buttonStyleSmall
+attr buttonTint
+attr buttonTintMode
+attr checkboxStyle
+attr checkedTextViewStyle
+attr closeIcon
+attr closeItemLayout
+attr collapseContentDescription
+attr collapseIcon
+attr color
+attr colorAccent
+attr colorBackgroundFloating
+attr colorButtonNormal
+attr colorControlActivated
+attr colorControlHighlight
+attr colorControlNormal
+attr colorError
+attr colorPrimary
+attr colorPrimaryDark
+attr commitIcon
+attr contentInsetEnd
+attr contentInsetEndWithActions
+attr contentInsetLeft
+attr contentInsetRight
+attr contentInsetStart
+attr contentInsetStartWithNavigation
+attr customNavigationLayout
+attr dialogCornerRadius
+attr dialogPreferredPadding
+attr dialogTheme
+attr displayOptions
+attr divider
+attr dividerHorizontal
+attr dividerPadding
+attr dividerVertical
+attr drawableSize
+attr drawerArrowStyle
+attr dropDownListViewStyle
+attr editTextBackground
+attr editTextColor
+attr editTextStyle
+attr elevation
+attr emojiCompatEnabled
+attr firstBaselineToTopHeight
+attr fontFamily
+attr fontVariationSettings
+attr gapBetweenBars
+attr goIcon
+attr height
+attr hideOnContentScroll
+attr homeAsUpIndicator
+attr homeLayout
+attr icon
+attr iconTint
+attr iconTintMode
+attr iconifiedByDefault
+attr imageButtonStyle
+attr indeterminateProgressStyle
+attr isLightTheme
+attr itemPadding
+attr lastBaselineToBottomHeight
+attr layout
+attr lineHeight
+attr listChoiceBackgroundIndicator
+attr listChoiceIndicatorMultipleAnimated
+attr listChoiceIndicatorSingleAnimated
+attr listDividerAlertDialog
+attr listPopupWindowStyle
+attr listPreferredItemHeight
+attr listPreferredItemHeightLarge
+attr listPreferredItemHeightSmall
+attr listPreferredItemPaddingEnd
+attr listPreferredItemPaddingLeft
+attr listPreferredItemPaddingRight
+attr listPreferredItemPaddingStart
+attr logo
+attr logoDescription
+attr maxButtonHeight
+attr measureWithLargestChild
+attr navigationContentDescription
+attr navigationIcon
+attr navigationMode
+attr overlapAnchor
+attr paddingEnd
+attr paddingStart
+attr panelBackground
+attr popupMenuStyle
+attr popupTheme
+attr popupWindowStyle
+attr preserveIconSpacing
+attr progressBarPadding
+attr progressBarStyle
+attr queryBackground
+attr queryHint
+attr radioButtonStyle
+attr ratingBarStyle
+attr ratingBarStyleIndicator
+attr ratingBarStyleSmall
+attr searchHintIcon
+attr searchIcon
+attr searchViewStyle
+attr seekBarStyle
+attr selectableItemBackground
+attr selectableItemBackgroundBorderless
+attr showAsAction
+attr showDividers
+attr showText
+attr spinBars
+attr spinnerDropDownItemStyle
+attr spinnerStyle
+attr splitTrack
+attr srcCompat
+attr state_above_anchor
+attr submitBackground
+attr subtitle
+attr subtitleTextAppearance
+attr subtitleTextColor
+attr subtitleTextStyle
+attr suggestionRowLayout
+attr switchMinWidth
+attr switchPadding
+attr switchStyle
+attr switchTextAppearance
+attr textAllCaps
+attr textAppearanceLargePopupMenu
+attr textAppearanceListItem
+attr textAppearanceListItemSecondary
+attr textAppearanceListItemSmall
+attr textAppearancePopupMenuHeader
+attr textAppearanceSearchResultSubtitle
+attr textAppearanceSearchResultTitle
+attr textAppearanceSmallPopupMenu
+attr textColorAlertDialogListItem
+attr textLocale
+attr theme
+attr thickness
+attr thumbTextPadding
+attr thumbTint
+attr thumbTintMode
+attr tickMark
+attr tickMarkTint
+attr tickMarkTintMode
+attr tint
+attr tintMode
+attr title
+attr titleMargin
+attr titleMarginBottom
+attr titleMarginEnd
+attr titleMarginStart
+attr titleMarginTop
+attr titleMargins
+attr titleTextAppearance
+attr titleTextColor
+attr titleTextStyle
+attr toolbarNavigationButtonStyle
+attr toolbarStyle
+attr track
+attr trackTint
+attr trackTintMode
+attr voiceIcon
+attr windowActionBar
+attr windowActionBarOverlay
+attr windowActionModeOverlay
+attr windowNoTitle
+layout support_simple_spinner_dropdown_item
+style TextAppearance_AppCompat
+style TextAppearance_AppCompat_Body1
+style TextAppearance_AppCompat_Body2
+style TextAppearance_AppCompat_Button
+style TextAppearance_AppCompat_Caption
+style TextAppearance_AppCompat_Display1
+style TextAppearance_AppCompat_Display2
+style TextAppearance_AppCompat_Display3
+style TextAppearance_AppCompat_Display4
+style TextAppearance_AppCompat_Headline
+style TextAppearance_AppCompat_Inverse
+style TextAppearance_AppCompat_Large
+style TextAppearance_AppCompat_Large_Inverse
+style TextAppearance_AppCompat_Light_SearchResult_Subtitle
+style TextAppearance_AppCompat_Light_SearchResult_Title
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Medium
+style TextAppearance_AppCompat_Medium_Inverse
+style TextAppearance_AppCompat_Menu
+style TextAppearance_AppCompat_SearchResult_Subtitle
+style TextAppearance_AppCompat_SearchResult_Title
+style TextAppearance_AppCompat_Small
+style TextAppearance_AppCompat_Small_Inverse
+style TextAppearance_AppCompat_Subhead
+style TextAppearance_AppCompat_Subhead_Inverse
+style TextAppearance_AppCompat_Title
+style TextAppearance_AppCompat_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Menu
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Title
+style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Title
+style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
+style TextAppearance_AppCompat_Widget_Button
+style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
+style TextAppearance_AppCompat_Widget_Button_Colored
+style TextAppearance_AppCompat_Widget_Button_Inverse
+style TextAppearance_AppCompat_Widget_DropDownItem
+style TextAppearance_AppCompat_Widget_PopupMenu_Header
+style TextAppearance_AppCompat_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Widget_Switch
+style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
+style ThemeOverlay_AppCompat
+style ThemeOverlay_AppCompat_ActionBar
+style ThemeOverlay_AppCompat_Dark
+style ThemeOverlay_AppCompat_Dark_ActionBar
+style ThemeOverlay_AppCompat_DayNight
+style ThemeOverlay_AppCompat_DayNight_ActionBar
+style ThemeOverlay_AppCompat_Dialog
+style ThemeOverlay_AppCompat_Dialog_Alert
+style ThemeOverlay_AppCompat_Light
+style Theme_AppCompat
+style Theme_AppCompat_DayNight
+style Theme_AppCompat_DayNight_DarkActionBar
+style Theme_AppCompat_DayNight_Dialog
+style Theme_AppCompat_DayNight_DialogWhenLarge
+style Theme_AppCompat_DayNight_Dialog_Alert
+style Theme_AppCompat_DayNight_Dialog_MinWidth
+style Theme_AppCompat_DayNight_NoActionBar
+style Theme_AppCompat_Dialog
+style Theme_AppCompat_DialogWhenLarge
+style Theme_AppCompat_Dialog_Alert
+style Theme_AppCompat_Dialog_MinWidth
+style Theme_AppCompat_Light
+style Theme_AppCompat_Light_DarkActionBar
+style Theme_AppCompat_Light_Dialog
+style Theme_AppCompat_Light_DialogWhenLarge
+style Theme_AppCompat_Light_Dialog_Alert
+style Theme_AppCompat_Light_Dialog_MinWidth
+style Theme_AppCompat_Light_NoActionBar
+style Theme_AppCompat_NoActionBar
+style Widget_AppCompat_ActionBar
+style Widget_AppCompat_ActionBar_Solid
+style Widget_AppCompat_ActionBar_TabBar
+style Widget_AppCompat_ActionBar_TabText
+style Widget_AppCompat_ActionBar_TabView
+style Widget_AppCompat_ActionButton
+style Widget_AppCompat_ActionButton_CloseMode
+style Widget_AppCompat_ActionButton_Overflow
+style Widget_AppCompat_ActionMode
+style Widget_AppCompat_AutoCompleteTextView
+style Widget_AppCompat_Button
+style Widget_AppCompat_ButtonBar
+style Widget_AppCompat_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Borderless
+style Widget_AppCompat_Button_Borderless_Colored
+style Widget_AppCompat_Button_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Colored
+style Widget_AppCompat_Button_Small
+style Widget_AppCompat_CompoundButton_CheckBox
+style Widget_AppCompat_CompoundButton_RadioButton
+style Widget_AppCompat_CompoundButton_Switch
+style Widget_AppCompat_DrawerArrowToggle
+style Widget_AppCompat_DropDownItem_Spinner
+style Widget_AppCompat_EditText
+style Widget_AppCompat_ImageButton
+style Widget_AppCompat_Light_ActionBar
+style Widget_AppCompat_Light_ActionBar_Solid
+style Widget_AppCompat_Light_ActionBar_Solid_Inverse
+style Widget_AppCompat_Light_ActionBar_TabBar
+style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
+style Widget_AppCompat_Light_ActionBar_TabText
+style Widget_AppCompat_Light_ActionBar_TabText_Inverse
+style Widget_AppCompat_Light_ActionBar_TabView
+style Widget_AppCompat_Light_ActionBar_TabView_Inverse
+style Widget_AppCompat_Light_ActionButton
+style Widget_AppCompat_Light_ActionButton_CloseMode
+style Widget_AppCompat_Light_ActionButton_Overflow
+style Widget_AppCompat_Light_ActionMode_Inverse
+style Widget_AppCompat_Light_AutoCompleteTextView
+style Widget_AppCompat_Light_DropDownItem_Spinner
+style Widget_AppCompat_Light_ListPopupWindow
+style Widget_AppCompat_Light_ListView_DropDown
+style Widget_AppCompat_Light_PopupMenu
+style Widget_AppCompat_Light_PopupMenu_Overflow
+style Widget_AppCompat_Light_SearchView
+style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
+style Widget_AppCompat_ListPopupWindow
+style Widget_AppCompat_ListView
+style Widget_AppCompat_ListView_DropDown
+style Widget_AppCompat_ListView_Menu
+style Widget_AppCompat_PopupMenu
+style Widget_AppCompat_PopupMenu_Overflow
+style Widget_AppCompat_PopupWindow
+style Widget_AppCompat_ProgressBar
+style Widget_AppCompat_ProgressBar_Horizontal
+style Widget_AppCompat_RatingBar
+style Widget_AppCompat_RatingBar_Indicator
+style Widget_AppCompat_RatingBar_Small
+style Widget_AppCompat_SearchView
+style Widget_AppCompat_SearchView_ActionBar
+style Widget_AppCompat_SeekBar
+style Widget_AppCompat_SeekBar_Discrete
+style Widget_AppCompat_Spinner
+style Widget_AppCompat_Spinner_DropDown
+style Widget_AppCompat_Spinner_DropDown_ActionBar
+style Widget_AppCompat_Spinner_Underlined
+style Widget_AppCompat_TextView
+style Widget_AppCompat_TextView_SpinnerItem
+style Widget_AppCompat_Toolbar
+style Widget_AppCompat_Toolbar_Button_Navigation
diff --git a/appcompat/appcompat/api/restricted_1.6.0-beta01.txt b/appcompat/appcompat/api/restricted_1.6.0-beta01.txt
new file mode 100644
index 0000000..5454c84
--- /dev/null
+++ b/appcompat/appcompat/api/restricted_1.6.0-beta01.txt
@@ -0,0 +1,2287 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean closeOptionsMenu();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean collapseActionView();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void dispatchMenuVisibilityChanged(boolean);
+    method public abstract android.view.View! getCustomView();
+    method @androidx.appcompat.app.ActionBar.DisplayOptions public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method @Deprecated public abstract int getNavigationItemCount();
+    method @Deprecated @androidx.appcompat.app.ActionBar.NavigationMode public abstract int getNavigationMode();
+    method @Deprecated public abstract int getSelectedNavigationIndex();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+    method public abstract CharSequence? getSubtitle();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method @Deprecated public abstract int getTabCount();
+    method public android.content.Context! getThemedContext();
+    method public abstract CharSequence? getTitle();
+    method public abstract void hide();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invalidateOptionsMenu();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onConfigurationChanged(android.content.res.Configuration!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onKeyShortcut(int, android.view.KeyEvent!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onMenuKeyEvent(android.view.KeyEvent!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean openOptionsMenu();
+    method @Deprecated public abstract void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method @Deprecated public abstract void removeTabAt(int);
+    method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public abstract void setCustomView(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDefaultDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int);
+    method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int, @androidx.appcompat.app.ActionBar.DisplayOptions int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(CharSequence?);
+    method public void setHomeActionContentDescription(@StringRes int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+    method public void setHomeAsUpIndicator(@DrawableRes int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(@DrawableRes int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public abstract void setLogo(@DrawableRes int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract void setNavigationMode(@androidx.appcompat.app.ActionBar.NavigationMode int);
+    method @Deprecated public abstract void setSelectedNavigationItem(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setShowHideAnimationEnabled(boolean);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(@StringRes int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setWindowTitle(CharSequence!);
+    method public abstract void show();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.ActionMode! startActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+    field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  @IntDef(flag=true, value={androidx.appcompat.app.ActionBar.DISPLAY_USE_LOGO, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_HOME, androidx.appcompat.app.ActionBar.DISPLAY_HOME_AS_UP, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_TITLE, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_CUSTOM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.DisplayOptions {
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    field public int gravity;
+  }
+
+  @IntDef({androidx.appcompat.app.ActionBar.NAVIGATION_MODE_STANDARD, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_LIST, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_TABS}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.NavigationMode {
+  }
+
+  public static interface ActionBar.OnMenuVisibilityListener {
+    method public void onMenuVisibilityChanged(boolean);
+  }
+
+  @Deprecated public static interface ActionBar.OnNavigationListener {
+    method @Deprecated public boolean onNavigationItemSelected(int, long);
+  }
+
+  @Deprecated public abstract static class ActionBar.Tab {
+    ctor @Deprecated public ActionBar.Tab();
+    method @Deprecated public abstract CharSequence! getContentDescription();
+    method @Deprecated public abstract android.view.View! getCustomView();
+    method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+    method @Deprecated public abstract int getPosition();
+    method @Deprecated public abstract Object! getTag();
+    method @Deprecated public abstract CharSequence! getText();
+    method @Deprecated public abstract void select();
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+    field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  @Deprecated public static interface ActionBar.TabListener {
+    method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+    method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+  }
+
+  public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+    ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+    method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+    method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public boolean isDrawerSlideAnimationEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDrawerClosed(android.view.View!);
+    method public void onDrawerOpened(android.view.View!);
+    method public void onDrawerSlide(android.view.View!, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem!);
+    method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setDrawerSlideAnimationEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+    method public void syncState();
+  }
+
+  public static interface ActionBarDrawerToggle.Delegate {
+    method public android.content.Context! getActionBarThemedContext();
+    method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+    method public boolean isNavigationVisible();
+    method public void setActionBarDescription(@StringRes int);
+    method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+  }
+
+  public static interface ActionBarDrawerToggle.DelegateProvider {
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, @StyleRes int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public android.widget.Button! getButton(int);
+    method public android.widget.ListView! getListView();
+    method public void setButton(int, CharSequence!, android.os.Message!);
+    method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+    method public void setCustomTitle(android.view.View!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setIconAttribute(int);
+    method public void setMessage(CharSequence!);
+    method public void setView(android.view.View!);
+    method public void setView(android.view.View!, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+    method public androidx.appcompat.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+    method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setRecycleOnMeasureEnabled(boolean);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+    method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!, int, int, int, int);
+    method public androidx.appcompat.app.AlertDialog! show();
+  }
+
+  public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.core.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    ctor @ContentView public AppCompatActivity(@LayoutRes int);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public android.content.Intent? getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method protected void onLocalesChanged(androidx.core.os.LocaleListCompat);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method protected void onNightModeChanged(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+    method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+    method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+    method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+    method @Deprecated public void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method @Deprecated public void setSupportProgress(int);
+    method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+    method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+    method @Deprecated public void setSupportProgressBarVisibility(boolean);
+    method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    method public void supportInvalidateOptionsMenu();
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public interface AppCompatCallback {
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public abstract boolean applyDayNight();
+    method @Deprecated public void attachBaseContext(android.content.Context!);
+    method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+    method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+    method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+    method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+    method @AnyThread public static androidx.core.os.LocaleListCompat getApplicationLocales();
+    method public android.content.Context? getContextForDelegate();
+    method @androidx.appcompat.app.AppCompatDelegate.NightMode public static int getDefaultNightMode();
+    method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+    method @androidx.appcompat.app.AppCompatDelegate.NightMode public int getLocalNightMode();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+    method public abstract void onCreate(android.os.Bundle!);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle!);
+    method public abstract void onPostResume();
+    method public abstract void onSaveInstanceState(android.os.Bundle!);
+    method public abstract void onStart();
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setApplicationLocales(androidx.core.os.LocaleListCompat);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public abstract void setContentView(android.view.View!);
+    method public abstract void setContentView(@LayoutRes int);
+    method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+    method public static void setDefaultNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method @RequiresApi(17) public abstract void setLocalNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+    method @CallSuper @RequiresApi(33) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher?);
+    method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+    method public void setTheme(@StyleRes int);
+    method public abstract void setTitle(CharSequence?);
+    method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+    field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+    field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  @IntDef({androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_TIME, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_UNSPECIFIED, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AppCompatDelegate.NightMode {
+  }
+
+  public class AppCompatDialog extends androidx.activity.ComponentDialog implements androidx.appcompat.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+    method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+    method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+    method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+    method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+    method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+    ctor public AppCompatDialogFragment(@LayoutRes int);
+  }
+
+  public class AppCompatViewInflater {
+    ctor public AppCompatViewInflater();
+    method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+    method public final android.view.View? createView(android.view.View?, String, android.content.Context, android.util.AttributeSet, boolean, boolean, boolean, boolean);
+    method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+  public final class AppLocalesMetadataHolderService extends android.app.Service {
+    ctor public AppLocalesMetadataHolderService();
+    method public static android.content.pm.ServiceInfo getServiceInfo(android.content.Context) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar extends androidx.appcompat.app.ActionBar implements androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback {
+    ctor public WindowDecorActionBar(android.app.Activity!, boolean);
+    ctor public WindowDecorActionBar(android.app.Dialog!);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public WindowDecorActionBar(android.view.View!);
+    method public void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public void animateToMode(boolean);
+    method public void doHide(boolean);
+    method public void doShow(boolean);
+    method public void enableContentAnimations(boolean);
+    method public android.view.View! getCustomView();
+    method public int getDisplayOptions();
+    method public int getHeight();
+    method public int getNavigationItemCount();
+    method public int getNavigationMode();
+    method public int getSelectedNavigationIndex();
+    method public androidx.appcompat.app.ActionBar.Tab! getSelectedTab();
+    method public CharSequence! getSubtitle();
+    method public androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+    method public int getTabCount();
+    method public CharSequence! getTitle();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public void hide();
+    method public void hideForSystem();
+    method public boolean isShowing();
+    method public androidx.appcompat.app.ActionBar.Tab! newTab();
+    method public void onContentScrollStarted();
+    method public void onContentScrollStopped();
+    method public void onWindowVisibilityChanged(int);
+    method public void removeAllTabs();
+    method public void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+    method public void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public void removeTabAt(int);
+    method public boolean requestFocus();
+    method public void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setCustomView(int);
+    method public void setCustomView(android.view.View!);
+    method public void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+    method public void setDisplayHomeAsUpEnabled(boolean);
+    method public void setDisplayOptions(int);
+    method public void setDisplayOptions(int, int);
+    method public void setDisplayShowCustomEnabled(boolean);
+    method public void setDisplayShowHomeEnabled(boolean);
+    method public void setDisplayShowTitleEnabled(boolean);
+    method public void setDisplayUseLogoEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setNavigationMode(int);
+    method public void setSelectedNavigationItem(int);
+    method public void setSubtitle(int);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(int);
+    method public void setTitle(CharSequence!);
+    method public void show();
+    method public void showForSystem();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.ActionModeImpl extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+    ctor public WindowDecorActionBar.ActionModeImpl(android.content.Context!, androidx.appcompat.view.ActionMode.Callback!);
+    method public boolean dispatchOnCreate();
+    method public void finish();
+    method public android.view.View! getCustomView();
+    method public android.view.Menu! getMenu();
+    method public android.view.MenuInflater! getMenuInflater();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public void invalidate();
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitle(int);
+    method public void setTitle(CharSequence!);
+    method public void setTitle(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.TabImpl extends androidx.appcompat.app.ActionBar.Tab {
+    ctor public WindowDecorActionBar.TabImpl();
+    method public androidx.appcompat.app.ActionBar.TabListener! getCallback();
+    method public CharSequence! getContentDescription();
+    method public android.view.View! getCustomView();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public int getPosition();
+    method public Object! getTag();
+    method public CharSequence! getText();
+    method public void select();
+    method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(int);
+    method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+    method public androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+    method public androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+    method public androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+    method public androidx.appcompat.app.ActionBar.Tab! setIcon(int);
+    method public void setPosition(int);
+    method public androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+    method public androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+    method public androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+    method public androidx.appcompat.app.ActionBar.Tab! setText(int);
+  }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context!);
+    method public void draw(android.graphics.Canvas!);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method @ColorInt public int getColor();
+    method @androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint! getPaint();
+    method @FloatRange(from=0.0, to=1.0) public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(@ColorInt int);
+    method public void setColorFilter(android.graphics.ColorFilter!);
+    method public void setDirection(@androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection int);
+    method public void setGapSize(float);
+    method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+  @IntDef({androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_LEFT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_RIGHT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_START, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface DrawerArrowDrawable.ArrowDirection {
+  }
+
+}
+
+package androidx.appcompat.text {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AllCapsTransformationMethod implements android.text.method.TransformationMethod {
+    ctor public AllCapsTransformationMethod(android.content.Context!);
+    method public CharSequence! getTransformation(CharSequence!, android.view.View!);
+    method public void onFocusChanged(android.view.View!, CharSequence!, boolean, int, android.graphics.Rect!);
+  }
+
+}
+
+package androidx.appcompat.view {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarPolicy {
+    method public boolean enableHomeButtonByDefault();
+    method public static androidx.appcompat.view.ActionBarPolicy! get(android.content.Context!);
+    method public int getEmbeddedMenuWidthLimit();
+    method public int getMaxActionButtons();
+    method public int getStackedTabMaxWidth();
+    method public int getTabContainerHeight();
+    method public boolean hasEmbeddedTabs();
+    method public boolean showsOverflowMenuButton();
+  }
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View! getCustomView();
+    method public abstract android.view.Menu! getMenu();
+    method public abstract android.view.MenuInflater! getMenuInflater();
+    method public abstract CharSequence! getSubtitle();
+    method public Object! getTag();
+    method public abstract CharSequence! getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isUiFocusable();
+    method public abstract void setCustomView(android.view.View!);
+    method public abstract void setSubtitle(CharSequence!);
+    method public abstract void setSubtitle(int);
+    method public void setTag(Object!);
+    method public abstract void setTitle(CharSequence!);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static interface ActionMode.Callback {
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @Deprecated public interface CollapsibleActionView {
+    method @Deprecated public void onActionViewCollapsed();
+    method @Deprecated public void onActionViewExpanded();
+  }
+
+  public class ContextThemeWrapper extends android.content.ContextWrapper {
+    ctor public ContextThemeWrapper();
+    ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+    ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+    method public void applyOverrideConfiguration(android.content.res.Configuration!);
+    method public int getThemeResId();
+    method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class StandaloneActionMode extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+    ctor public StandaloneActionMode(android.content.Context!, androidx.appcompat.widget.ActionBarContextView!, androidx.appcompat.view.ActionMode.Callback!, boolean);
+    method public void finish();
+    method public android.view.View! getCustomView();
+    method public android.view.Menu! getMenu();
+    method public android.view.MenuInflater! getMenuInflater();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public void invalidate();
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitle(int);
+    method public void setTitle(CharSequence!);
+    method public void setTitle(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportActionModeWrapper extends android.view.ActionMode {
+    ctor public SupportActionModeWrapper(android.content.Context!, androidx.appcompat.view.ActionMode!);
+    method public void finish();
+    method public android.view.View! getCustomView();
+    method public android.view.Menu! getMenu();
+    method public android.view.MenuInflater! getMenuInflater();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public void invalidate();
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitle(int);
+    method public void setTitle(CharSequence!);
+    method public void setTitle(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SupportActionModeWrapper.CallbackWrapper implements androidx.appcompat.view.ActionMode.Callback {
+    ctor public SupportActionModeWrapper.CallbackWrapper(android.content.Context!, android.view.ActionMode.Callback!);
+    method public android.view.ActionMode! getActionModeWrapper(androidx.appcompat.view.ActionMode!);
+    method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+    method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+    method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+    method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportMenuInflater extends android.view.MenuInflater {
+    ctor public SupportMenuInflater(android.content.Context!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewPropertyAnimatorCompatSet {
+    ctor public ViewPropertyAnimatorCompatSet();
+    method public void cancel();
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! play(androidx.core.view.ViewPropertyAnimatorCompat!);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! playSequentially(androidx.core.view.ViewPropertyAnimatorCompat!, androidx.core.view.ViewPropertyAnimatorCompat!);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setDuration(long);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setInterpolator(android.view.animation.Interpolator!);
+    method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+    method public void start();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowCallbackWrapper implements android.view.Window.Callback {
+    ctor public WindowCallbackWrapper(android.view.Window.Callback!);
+    method public boolean dispatchGenericMotionEvent(android.view.MotionEvent!);
+    method public boolean dispatchKeyEvent(android.view.KeyEvent!);
+    method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent!);
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent!);
+    method public boolean dispatchTouchEvent(android.view.MotionEvent!);
+    method public boolean dispatchTrackballEvent(android.view.MotionEvent!);
+    method public final android.view.Window.Callback! getWrapped();
+    method public void onActionModeFinished(android.view.ActionMode!);
+    method public void onActionModeStarted(android.view.ActionMode!);
+    method public void onAttachedToWindow();
+    method public void onContentChanged();
+    method public boolean onCreatePanelMenu(int, android.view.Menu!);
+    method public android.view.View! onCreatePanelView(int);
+    method public void onDetachedFromWindow();
+    method public boolean onMenuItemSelected(int, android.view.MenuItem!);
+    method public boolean onMenuOpened(int, android.view.Menu!);
+    method public void onPanelClosed(int, android.view.Menu!);
+    method public boolean onPreparePanel(int, android.view.View!, android.view.Menu!);
+    method @RequiresApi(23) public boolean onSearchRequested(android.view.SearchEvent!);
+    method public boolean onSearchRequested();
+    method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams!);
+    method public void onWindowFocusChanged(boolean);
+    method public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!);
+    method @RequiresApi(23) public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!, int);
+  }
+
+}
+
+package androidx.appcompat.view.menu {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItem implements androidx.core.internal.view.SupportMenuItem {
+    ctor public ActionMenuItem(android.content.Context!, int, int, int, int, CharSequence!);
+    method public boolean collapseActionView();
+    method public boolean expandActionView();
+    method public android.view.ActionProvider! getActionProvider();
+    method public android.view.View! getActionView();
+    method public char getAlphabeticShortcut();
+    method public int getGroupId();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public android.content.Intent! getIntent();
+    method public int getItemId();
+    method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+    method public char getNumericShortcut();
+    method public int getOrder();
+    method public android.view.SubMenu! getSubMenu();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTitle();
+    method public CharSequence! getTitleCondensed();
+    method public boolean hasSubMenu();
+    method public boolean invoke();
+    method public boolean isActionViewExpanded();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isVisible();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(android.view.View!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(int);
+    method public android.view.MenuItem! setAlphabeticShortcut(char);
+    method public android.view.MenuItem! setCheckable(boolean);
+    method public android.view.MenuItem! setChecked(boolean);
+    method public androidx.core.internal.view.SupportMenuItem setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setEnabled(boolean);
+    method public androidx.appcompat.view.menu.ActionMenuItem! setExclusiveCheckable(boolean);
+    method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.MenuItem! setIcon(int);
+    method public android.view.MenuItem! setIntent(android.content.Intent!);
+    method public android.view.MenuItem! setNumericShortcut(char);
+    method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+    method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+    method public android.view.MenuItem! setShortcut(char, char);
+    method public void setShowAsAction(int);
+    method public androidx.core.internal.view.SupportMenuItem setShowAsActionFlags(int);
+    method public androidx.core.internal.view.SupportMenuItem setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public android.view.MenuItem! setTitle(CharSequence!);
+    method public android.view.MenuItem! setTitle(int);
+    method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+    method public androidx.core.internal.view.SupportMenuItem setTooltipText(CharSequence!);
+    method public android.view.MenuItem! setVisible(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItemView extends androidx.appcompat.widget.AppCompatTextView implements androidx.appcompat.widget.ActionMenuView.ActionMenuChildView androidx.appcompat.view.menu.MenuView.ItemView android.view.View.OnClickListener {
+    ctor public ActionMenuItemView(android.content.Context!);
+    ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+    method public boolean hasText();
+    method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+    method public boolean needsDividerAfter();
+    method public boolean needsDividerBefore();
+    method public void onClick(android.view.View!);
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public boolean prefersCondensedTitle();
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setExpandedFormat(boolean);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setItemInvoker(androidx.appcompat.view.menu.MenuBuilder.ItemInvoker!);
+    method public void setPopupCallback(androidx.appcompat.view.menu.ActionMenuItemView.PopupCallback!);
+    method public void setShortcut(boolean, char);
+    method public void setTitle(CharSequence!);
+    method public boolean showsIcon();
+  }
+
+  public abstract static class ActionMenuItemView.PopupCallback {
+    ctor public ActionMenuItemView.PopupCallback();
+    method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class BaseMenuPresenter implements androidx.appcompat.view.menu.MenuPresenter {
+    ctor public BaseMenuPresenter(android.content.Context!, int, int);
+    method protected void addItemView(android.view.View!, int);
+    method public abstract void bindItemView(androidx.appcompat.view.menu.MenuItemImpl!, androidx.appcompat.view.menu.MenuView.ItemView!);
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public androidx.appcompat.view.menu.MenuView.ItemView! createItemView(android.view.ViewGroup!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method protected boolean filterLeftoverView(android.view.ViewGroup!, int);
+    method public boolean flagActionItems();
+    method public androidx.appcompat.view.menu.MenuPresenter.Callback! getCallback();
+    method public int getId();
+    method public android.view.View! getItemView(androidx.appcompat.view.menu.MenuItemImpl!, android.view.View!, android.view.ViewGroup!);
+    method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+    method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setId(int);
+    method public boolean shouldIncludeItem(int, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public void updateMenuView(boolean);
+    field protected android.content.Context! mContext;
+    field protected android.view.LayoutInflater! mInflater;
+    field protected androidx.appcompat.view.menu.MenuBuilder! mMenu;
+    field protected androidx.appcompat.view.menu.MenuView! mMenuView;
+    field protected android.content.Context! mSystemContext;
+    field protected android.view.LayoutInflater! mSystemInflater;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ExpandedMenuView extends android.widget.ListView implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+    ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!);
+    ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!, int);
+    method public int getWindowAnimations();
+    method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+    method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+    method public void onItemClick(android.widget.AdapterView!, android.view.View!, int, long);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuItemView extends android.widget.LinearLayout implements android.widget.AbsListView.SelectionBoundsAdjuster androidx.appcompat.view.menu.MenuView.ItemView {
+    ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!);
+    ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+    method public void adjustListItemSelectionBounds(android.graphics.Rect!);
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+    method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+    method public boolean prefersCondensedTitle();
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setForceShowIcon(boolean);
+    method public void setGroupDividerEnabled(boolean);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setShortcut(boolean, char);
+    method public void setTitle(CharSequence!);
+    method public boolean showsIcon();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuPresenter implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuPresenter {
+    ctor public ListMenuPresenter(android.content.Context!, int);
+    ctor public ListMenuPresenter(int, int);
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean flagActionItems();
+    method public android.widget.ListAdapter! getAdapter();
+    method public int getId();
+    method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+    method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onItemClick(android.widget.AdapterView<?>!, android.view.View!, int, long);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable! onSaveInstanceState();
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void restoreHierarchyState(android.os.Bundle!);
+    method public void saveHierarchyState(android.os.Bundle!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setId(int);
+    method public void setItemIndexOffset(int);
+    method public void updateMenuView(boolean);
+    field public static final String VIEWS_TAG = "android:menu:list";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuAdapter extends android.widget.BaseAdapter {
+    ctor public MenuAdapter(androidx.appcompat.view.menu.MenuBuilder!, android.view.LayoutInflater!, boolean, int);
+    method public androidx.appcompat.view.menu.MenuBuilder! getAdapterMenu();
+    method public int getCount();
+    method public boolean getForceShowIcon();
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItem(int);
+    method public long getItemId(int);
+    method public android.view.View! getView(int, android.view.View!, android.view.ViewGroup!);
+    method public void setForceShowIcon(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuBuilder implements androidx.core.internal.view.SupportMenu {
+    ctor public MenuBuilder(android.content.Context!);
+    method public android.view.MenuItem! add(CharSequence!);
+    method public android.view.MenuItem! add(int);
+    method public android.view.MenuItem! add(int, int, int, CharSequence!);
+    method public android.view.MenuItem! add(int, int, int, int);
+    method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+    method protected android.view.MenuItem! addInternal(int, int, int, CharSequence!);
+    method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+    method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!, android.content.Context!);
+    method public android.view.SubMenu! addSubMenu(CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int);
+    method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int, int, int, int);
+    method public void changeMenuMode();
+    method public void clear();
+    method public void clearAll();
+    method public void clearHeader();
+    method public final void close(boolean);
+    method public void close();
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+    method public int findGroupIndex(int);
+    method public int findGroupIndex(int, int);
+    method public android.view.MenuItem! findItem(int);
+    method public int findItemIndex(int);
+    method public void flagActionItems();
+    method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getActionItems();
+    method protected String! getActionViewStatesKey();
+    method public android.content.Context! getContext();
+    method public androidx.appcompat.view.menu.MenuItemImpl! getExpandedItem();
+    method public android.graphics.drawable.Drawable! getHeaderIcon();
+    method public CharSequence! getHeaderTitle();
+    method public android.view.View! getHeaderView();
+    method public android.view.MenuItem! getItem(int);
+    method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getNonActionItems();
+    method public androidx.appcompat.view.menu.MenuBuilder! getRootMenu();
+    method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!> getVisibleItems();
+    method public boolean hasVisibleItems();
+    method public boolean isGroupDividerEnabled();
+    method public boolean isShortcutKey(int, android.view.KeyEvent!);
+    method public boolean isShortcutsVisible();
+    method public void onItemsChanged(boolean);
+    method public boolean performIdentifierAction(int, int);
+    method public boolean performItemAction(android.view.MenuItem!, int);
+    method public boolean performItemAction(android.view.MenuItem!, androidx.appcompat.view.menu.MenuPresenter!, int);
+    method public boolean performShortcut(int, android.view.KeyEvent!, int);
+    method public void removeGroup(int);
+    method public void removeItem(int);
+    method public void removeItemAt(int);
+    method public void removeMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+    method public void restoreActionViewStates(android.os.Bundle!);
+    method public void restorePresenterStates(android.os.Bundle!);
+    method public void saveActionViewStates(android.os.Bundle!);
+    method public void savePresenterStates(android.os.Bundle!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setCurrentMenuInfo(android.view.ContextMenu.ContextMenuInfo!);
+    method public androidx.appcompat.view.menu.MenuBuilder! setDefaultShowAsAction(int);
+    method public void setGroupCheckable(int, boolean, boolean);
+    method public void setGroupEnabled(int, boolean);
+    method public void setGroupVisible(int, boolean);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(android.graphics.drawable.Drawable!);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(int);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(CharSequence!);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(int);
+    method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderViewInt(android.view.View!);
+    method public void setOptionalIconsVisible(boolean);
+    method public void setOverrideVisibleItems(boolean);
+    method public void setQwertyMode(boolean);
+    method public void setShortcutsVisible(boolean);
+    method public int size();
+    method public void startDispatchingItemsChanged();
+    method public void stopDispatchingItemsChanged();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.Callback {
+    method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.ItemInvoker {
+    method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class MenuItemImpl implements androidx.core.internal.view.SupportMenuItem {
+    method public void actionFormatChanged();
+    method public boolean collapseActionView();
+    method public boolean expandActionView();
+    method public android.view.ActionProvider! getActionProvider();
+    method public android.view.View! getActionView();
+    method public char getAlphabeticShortcut();
+    method public int getGroupId();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public android.content.Intent! getIntent();
+    method public int getItemId();
+    method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+    method public char getNumericShortcut();
+    method public int getOrder();
+    method public int getOrdering();
+    method public android.view.SubMenu! getSubMenu();
+    method public androidx.core.view.ActionProvider! getSupportActionProvider();
+    method public CharSequence! getTitle();
+    method public CharSequence! getTitleCondensed();
+    method public boolean hasCollapsibleActionView();
+    method public boolean hasSubMenu();
+    method public boolean invoke();
+    method public boolean isActionButton();
+    method public boolean isActionViewExpanded();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isExclusiveCheckable();
+    method public boolean isVisible();
+    method public boolean requestsActionButton();
+    method public boolean requiresActionButton();
+    method public boolean requiresOverflow();
+    method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(android.view.View!);
+    method public androidx.core.internal.view.SupportMenuItem setActionView(int);
+    method public void setActionViewExpanded(boolean);
+    method public android.view.MenuItem! setAlphabeticShortcut(char);
+    method public android.view.MenuItem! setCallback(Runnable!);
+    method public android.view.MenuItem! setCheckable(boolean);
+    method public android.view.MenuItem! setChecked(boolean);
+    method public androidx.core.internal.view.SupportMenuItem setContentDescription(CharSequence!);
+    method public android.view.MenuItem! setEnabled(boolean);
+    method public void setExclusiveCheckable(boolean);
+    method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.MenuItem! setIcon(int);
+    method public android.view.MenuItem! setIntent(android.content.Intent!);
+    method public void setIsActionButton(boolean);
+    method public android.view.MenuItem! setNumericShortcut(char);
+    method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+    method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+    method public android.view.MenuItem! setShortcut(char, char);
+    method public void setShowAsAction(int);
+    method public androidx.core.internal.view.SupportMenuItem setShowAsActionFlags(int);
+    method public void setSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public androidx.core.internal.view.SupportMenuItem setSupportActionProvider(androidx.core.view.ActionProvider!);
+    method public android.view.MenuItem! setTitle(CharSequence!);
+    method public android.view.MenuItem! setTitle(int);
+    method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+    method public androidx.core.internal.view.SupportMenuItem setTooltipText(CharSequence!);
+    method public android.view.MenuItem! setVisible(boolean);
+    method public boolean shouldShowIcon();
+    method public boolean showsTextAsAction();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuItemWrapperICS implements android.view.MenuItem {
+    ctor public MenuItemWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenuItem!);
+    method public boolean collapseActionView();
+    method public boolean expandActionView();
+    method public android.view.ActionProvider! getActionProvider();
+    method public android.view.View! getActionView();
+    method public char getAlphabeticShortcut();
+    method public int getGroupId();
+    method public android.graphics.drawable.Drawable! getIcon();
+    method public android.content.Intent! getIntent();
+    method public int getItemId();
+    method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+    method public char getNumericShortcut();
+    method public int getOrder();
+    method public android.view.SubMenu! getSubMenu();
+    method public CharSequence! getTitle();
+    method public CharSequence! getTitleCondensed();
+    method public boolean hasSubMenu();
+    method public boolean isActionViewExpanded();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isVisible();
+    method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+    method public android.view.MenuItem! setActionView(android.view.View!);
+    method public android.view.MenuItem! setActionView(int);
+    method public android.view.MenuItem! setAlphabeticShortcut(char);
+    method public android.view.MenuItem! setCheckable(boolean);
+    method public android.view.MenuItem! setChecked(boolean);
+    method public android.view.MenuItem! setEnabled(boolean);
+    method public void setExclusiveCheckable(boolean);
+    method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.MenuItem! setIcon(int);
+    method public android.view.MenuItem! setIntent(android.content.Intent!);
+    method public android.view.MenuItem! setNumericShortcut(char);
+    method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+    method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+    method public android.view.MenuItem! setShortcut(char, char);
+    method public void setShowAsAction(int);
+    method public android.view.MenuItem! setShowAsActionFlags(int);
+    method public android.view.MenuItem! setTitle(CharSequence!);
+    method public android.view.MenuItem! setTitle(int);
+    method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+    method public android.view.MenuItem! setVisible(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupHelper {
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder);
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View);
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int);
+    ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public int getGravity();
+    method public android.widget.ListView! getListView();
+    method public boolean isShowing();
+    method protected void onDismiss();
+    method public void setAnchorView(android.view.View);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setPresenterCallback(androidx.appcompat.view.menu.MenuPresenter.Callback?);
+    method public void show();
+    method public void show(int, int);
+    method public boolean tryShow();
+    method public boolean tryShow(int, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuPresenter {
+    method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public boolean flagActionItems();
+    method public int getId();
+    method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+    method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable! onSaveInstanceState();
+    method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+    method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void updateMenuView(boolean);
+  }
+
+  public static interface MenuPresenter.Callback {
+    method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder, boolean);
+    method public boolean onOpenSubMenu(androidx.appcompat.view.menu.MenuBuilder);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuView {
+    method public int getWindowAnimations();
+    method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+  }
+
+  public static interface MenuView.ItemView {
+    method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+    method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+    method public boolean prefersCondensedTitle();
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setEnabled(boolean);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setShortcut(boolean, char);
+    method public void setTitle(CharSequence!);
+    method public boolean showsIcon();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuWrapperICS implements android.view.Menu {
+    ctor public MenuWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenu!);
+    method public android.view.MenuItem! add(CharSequence!);
+    method public android.view.MenuItem! add(int);
+    method public android.view.MenuItem! add(int, int, int, CharSequence!);
+    method public android.view.MenuItem! add(int, int, int, int);
+    method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+    method public android.view.SubMenu! addSubMenu(CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int);
+    method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+    method public android.view.SubMenu! addSubMenu(int, int, int, int);
+    method public void clear();
+    method public void close();
+    method public android.view.MenuItem! findItem(int);
+    method public android.view.MenuItem! getItem(int);
+    method public boolean hasVisibleItems();
+    method public boolean isShortcutKey(int, android.view.KeyEvent!);
+    method public boolean performIdentifierAction(int, int);
+    method public boolean performShortcut(int, android.view.KeyEvent!, int);
+    method public void removeGroup(int);
+    method public void removeItem(int);
+    method public void setGroupCheckable(int, boolean, boolean);
+    method public void setGroupEnabled(int, boolean);
+    method public void setGroupVisible(int, boolean);
+    method public void setQwertyMode(boolean);
+    method public int size();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface ShowableListMenu {
+    method public void dismiss();
+    method public android.widget.ListView! getListView();
+    method public boolean isShowing();
+    method public void show();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SubMenuBuilder extends androidx.appcompat.view.menu.MenuBuilder implements android.view.SubMenu {
+    ctor public SubMenuBuilder(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+    method public String! getActionViewStatesKey();
+    method public android.view.MenuItem! getItem();
+    method public android.view.Menu! getParentMenu();
+    method public boolean isQwertyMode();
+    method public android.view.SubMenu! setHeaderIcon(android.graphics.drawable.Drawable!);
+    method public android.view.SubMenu! setHeaderIcon(int);
+    method public android.view.SubMenu! setHeaderTitle(CharSequence!);
+    method public android.view.SubMenu! setHeaderTitle(int);
+    method public android.view.SubMenu! setHeaderView(android.view.View!);
+    method public android.view.SubMenu! setIcon(android.graphics.drawable.Drawable!);
+    method public android.view.SubMenu! setIcon(int);
+  }
+
+}
+
+package androidx.appcompat.widget {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContainer extends android.widget.FrameLayout {
+    ctor public ActionBarContainer(android.content.Context!);
+    ctor public ActionBarContainer(android.content.Context!, android.util.AttributeSet!);
+    method public android.view.View! getTabContainer();
+    method public void onFinishInflate();
+    method public void onLayout(boolean, int, int, int, int);
+    method public void onMeasure(int, int);
+    method public void setPrimaryBackground(android.graphics.drawable.Drawable!);
+    method public void setSplitBackground(android.graphics.drawable.Drawable!);
+    method public void setStackedBackground(android.graphics.drawable.Drawable!);
+    method public void setTabContainer(androidx.appcompat.widget.ScrollingTabContainerView!);
+    method public void setTransitioning(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContextView extends android.view.ViewGroup {
+    ctor public ActionBarContextView(android.content.Context);
+    ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?);
+    ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?, int);
+    method public void animateToVisibility(int);
+    method public boolean canShowOverflowMenu();
+    method public void closeMode();
+    method public void dismissPopupMenus();
+    method public int getAnimatedVisibility();
+    method public int getContentHeight();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public boolean hideOverflowMenu();
+    method public void initForMode(androidx.appcompat.view.ActionMode!);
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public boolean isOverflowReserved();
+    method public boolean isTitleOptional();
+    method public void killMode();
+    method public void onDetachedFromWindow();
+    method public void postShowOverflowMenu();
+    method public void setContentHeight(int);
+    method public void setCustomView(android.view.View!);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(CharSequence!);
+    method public void setTitleOptional(boolean);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarOverlayLayout extends android.view.ViewGroup implements androidx.appcompat.widget.DecorContentParent androidx.core.view.NestedScrollingParent androidx.core.view.NestedScrollingParent2 androidx.core.view.NestedScrollingParent3 {
+    ctor public ActionBarOverlayLayout(android.content.Context);
+    ctor public ActionBarOverlayLayout(android.content.Context, android.util.AttributeSet?);
+    method public boolean canShowOverflowMenu();
+    method public void dismissPopups();
+    method protected boolean fitSystemWindows(android.graphics.Rect!);
+    method protected androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method public int getActionBarHideOffset();
+    method public CharSequence! getTitle();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initFeature(int);
+    method public boolean isHideOnContentScrollEnabled();
+    method public boolean isInOverlayMode();
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public void onNestedPreScroll(android.view.View!, int, int, int[]!, int);
+    method public void onNestedScroll(android.view.View!, int, int, int, int, int, int[]!);
+    method public void onNestedScroll(android.view.View!, int, int, int, int, int);
+    method public void onNestedScrollAccepted(android.view.View!, android.view.View!, int, int);
+    method public boolean onStartNestedScroll(android.view.View!, android.view.View!, int, int);
+    method public void onStopNestedScroll(android.view.View!, int);
+    method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setActionBarHideOffset(int);
+    method public void setActionBarVisibilityCallback(androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback!);
+    method public void setHasNonEmbeddedTabs(boolean);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuPrepared();
+    method public void setOverlayMode(boolean);
+    method public void setShowingForActionMode(boolean);
+    method public void setUiOptions(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public boolean showOverflowMenu();
+  }
+
+  public static interface ActionBarOverlayLayout.ActionBarVisibilityCallback {
+    method public void enableContentAnimations(boolean);
+    method public void hideForSystem();
+    method public void onContentScrollStarted();
+    method public void onContentScrollStopped();
+    method public void onWindowVisibilityChanged(int);
+    method public void showForSystem();
+  }
+
+  public static class ActionBarOverlayLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBarOverlayLayout.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionBarOverlayLayout.LayoutParams(int, int);
+    ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateOverflowButtonLayoutParams();
+    method public android.view.Menu! getMenu();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getWindowAnimations();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected boolean hasSupportDividerBeforeChildAt(int);
+    method public boolean hideOverflowMenu();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowReserved();
+    method public void onConfigurationChanged(android.content.res.Configuration!);
+    method public void onDetachedFromWindow();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.menu.MenuBuilder! peekMenu();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setExpandedActionViewsExclusive(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverflowReserved(boolean);
+    method public void setPopupTheme(@StyleRes int);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionMenuView.ActionMenuChildView {
+    method public boolean needsDividerAfter();
+    method public boolean needsDividerBefore();
+  }
+
+  public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static interface ActionMenuView.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActivityChooserView extends android.view.ViewGroup {
+    ctor public ActivityChooserView(android.content.Context);
+    ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?);
+    ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?, int);
+    method public boolean dismissPopup();
+    method public boolean isShowingPopup();
+    method public void setDefaultActionButtonContentDescription(int);
+    method public void setExpandActivityOverflowButtonContentDescription(int);
+    method public void setExpandActivityOverflowButtonDrawable(android.graphics.drawable.Drawable!);
+    method public void setInitialActivityCount(int);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setProvider(androidx.core.view.ActionProvider!);
+    method public boolean showPopup();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ActivityChooserView.InnerLayout extends android.widget.LinearLayout {
+    ctor public ActivityChooserView.InnerLayout(android.content.Context!, android.util.AttributeSet!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AlertDialogLayout extends androidx.appcompat.widget.LinearLayoutCompat {
+    ctor public AlertDialogLayout(android.content.Context?);
+    ctor public AlertDialogLayout(android.content.Context?, android.util.AttributeSet?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setSupportAllCaps(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class AppCompatDrawableManager {
+    ctor public AppCompatDrawableManager();
+    method public static androidx.appcompat.widget.AppCompatDrawableManager! get();
+    method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+    method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+    method public void onConfigurationChanged(android.content.Context);
+    method public static void preload();
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AppCompatImageHelper {
+    ctor public AppCompatImageHelper(android.widget.ImageView);
+    method public void loadFromAttributes(android.util.AttributeSet!, int);
+    method public void setImageResource(int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatRadioButton(android.content.Context!);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+    ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+    ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+    method public boolean isEmojiCompatEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setEmojiCompatEnabled(boolean);
+    method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTextAppearance(android.content.Context!, int);
+    method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+    method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+  }
+
+  @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+    ctor public AppCompatToggleButton(android.content.Context);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+    ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ButtonBarLayout extends android.widget.LinearLayout {
+    ctor public ButtonBarLayout(android.content.Context, android.util.AttributeSet?);
+    method public void setAllowStacking(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorContentParent {
+    method public boolean canShowOverflowMenu();
+    method public void dismissPopups();
+    method public CharSequence! getTitle();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initFeature(int);
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuPrepared();
+    method public void setUiOptions(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorToolbar {
+    method public void animateToVisibility(int);
+    method public boolean canShowOverflowMenu();
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method public android.content.Context! getContext();
+    method public android.view.View! getCustomView();
+    method public int getDisplayOptions();
+    method public int getDropdownItemCount();
+    method public int getDropdownSelectedPosition();
+    method public int getHeight();
+    method public android.view.Menu! getMenu();
+    method public int getNavigationMode();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public android.view.ViewGroup! getViewGroup();
+    method public int getVisibility();
+    method public boolean hasEmbeddedTabs();
+    method public boolean hasExpandedActionView();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initIndeterminateProgress();
+    method public void initProgress();
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public boolean isTitleTruncated();
+    method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setCollapsible(boolean);
+    method public void setCustomView(android.view.View!);
+    method public void setDefaultNavigationContentDescription(int);
+    method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setDisplayOptions(int);
+    method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+    method public void setDropdownSelectedPosition(int);
+    method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+    method public void setHomeButtonEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setMenuPrepared();
+    method public void setNavigationContentDescription(CharSequence!);
+    method public void setNavigationContentDescription(int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setNavigationIcon(int);
+    method public void setNavigationMode(int);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(CharSequence!);
+    method public void setVisibility(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+    method public boolean showOverflowMenu();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DialogTitle extends androidx.appcompat.widget.AppCompatTextView {
+    ctor public DialogTitle(android.content.Context, android.util.AttributeSet?, int);
+    ctor public DialogTitle(android.content.Context, android.util.AttributeSet?);
+    ctor public DialogTitle(android.content.Context);
+  }
+
+  public interface EmojiCompatConfigurationView {
+    method public boolean isEmojiCompatEnabled();
+    method public void setEmojiCompatEnabled(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsFrameLayout extends android.widget.FrameLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+    ctor public FitWindowsFrameLayout(android.content.Context);
+    ctor public FitWindowsFrameLayout(android.content.Context, android.util.AttributeSet?);
+    method protected boolean fitSystemWindows(android.graphics.Rect!);
+    method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsLinearLayout extends android.widget.LinearLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+    ctor public FitWindowsLinearLayout(android.content.Context);
+    ctor public FitWindowsLinearLayout(android.content.Context, android.util.AttributeSet?);
+    method protected boolean fitSystemWindows(android.graphics.Rect!);
+    method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface FitWindowsViewGroup {
+    method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+  }
+
+  public static interface FitWindowsViewGroup.OnFitSystemWindowsListener {
+    method public void onFitSystemWindows(android.graphics.Rect!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ForwardingListener implements android.view.View.OnAttachStateChangeListener android.view.View.OnTouchListener {
+    ctor public ForwardingListener(android.view.View!);
+    method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+    method protected boolean onForwardingStarted();
+    method protected boolean onForwardingStopped();
+    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+    method public void onViewAttachedToWindow(android.view.View!);
+    method public void onViewDetachedFromWindow(android.view.View!);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getDividerWidth();
+    method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+    method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+    method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+    method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+    method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+    method public void setDividerPadding(int);
+    method public void setGravity(@GravityInt int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(@androidx.appcompat.widget.LinearLayoutCompat.OrientationMode int);
+    method public void setShowDividers(@androidx.appcompat.widget.LinearLayoutCompat.DividerMode int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  @IntDef(flag=true, value={androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_NONE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_BEGINNING, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_MIDDLE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.DividerMode {
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+  }
+
+  @IntDef({androidx.appcompat.widget.LinearLayoutCompat.HORIZONTAL, androidx.appcompat.widget.LinearLayoutCompat.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.OrientationMode {
+  }
+
+  public class ListPopupWindow implements androidx.appcompat.view.menu.ShowableListMenu {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+    method public void dismiss();
+    method public android.view.View? getAnchorView();
+    method @StyleRes public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable? getBackground();
+    method public android.graphics.Rect? getEpicenterBounds();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView? getListView();
+    method public int getPromptPosition();
+    method public Object? getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View? getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isDropDownAlwaysVisible();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter?);
+    method public void setAnchorView(android.view.View?);
+    method public void setAnimationStyle(@StyleRes int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+    method public void setContentWidth(int);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDropDownAlwaysVisible(boolean);
+    method public void setDropDownGravity(int);
+    method public void setEpicenterBounds(android.graphics.Rect?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setForceIgnoreOutsideTouch(boolean);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable!);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverlapAnchor(boolean);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View?);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuItemHoverListener {
+    method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupWindow extends androidx.appcompat.widget.ListPopupWindow implements androidx.appcompat.widget.MenuItemHoverListener {
+    ctor public MenuPopupWindow(android.content.Context, android.util.AttributeSet?, int, int);
+    method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+    method public void setEnterTransition(Object!);
+    method public void setExitTransition(Object!);
+    method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+    method public void setTouchModal(boolean);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class MenuPopupWindow.MenuDropDownListView extends android.widget.ListView {
+    ctor public MenuPopupWindow.MenuDropDownListView(android.content.Context!, boolean);
+    method public void clearSelection();
+    method public int lookForSelectablePosition(int, boolean);
+    method public int measureHeightOfChildrenCompat(int, int, int, int, int);
+    method public boolean onForwardedEvent(android.view.MotionEvent!, int);
+    method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+    field public static final int NO_POSITION = -1; // 0xffffffff
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(@MenuRes int);
+    method public void setForceShowIcon(boolean);
+    method public void setGravity(int);
+    method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+    method public void show();
+  }
+
+  public static interface PopupMenu.OnDismissListener {
+    method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+  }
+
+  public static interface PopupMenu.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ScrollingTabContainerView extends android.widget.HorizontalScrollView implements android.widget.AdapterView.OnItemSelectedListener {
+    ctor public ScrollingTabContainerView(android.content.Context);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+    method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+    method public void animateToTab(int);
+    method public void animateToVisibility(int);
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void onItemSelected(android.widget.AdapterView<?>!, android.view.View!, int, long);
+    method public void onMeasure(int, int);
+    method public void onNothingSelected(android.widget.AdapterView<?>!);
+    method public void removeAllTabs();
+    method public void removeTabAt(int);
+    method public void setAllowCollapse(boolean);
+    method public void setContentHeight(int);
+    method public void setTabSelected(int);
+    method public void updateTab(int);
+    field protected final androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! mVisAnimListener;
+    field protected android.view.ViewPropertyAnimator! mVisibilityAnim;
+  }
+
+  protected class ScrollingTabContainerView.VisibilityAnimListener extends android.animation.AnimatorListenerAdapter {
+    ctor protected ScrollingTabContainerView.VisibilityAnimListener();
+    method public androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! withFinalVisibility(android.view.ViewPropertyAnimator!, int);
+  }
+
+  public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+    method public int getInputType();
+    method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method protected void onQueryRefine(CharSequence?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAppSearchData(android.os.Bundle!);
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+    method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+    method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+    method public void setQuery(CharSequence!, boolean);
+    method public void setQueryHint(CharSequence?);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo!);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+  }
+
+  public static interface SearchView.OnCloseListener {
+    method public boolean onClose();
+  }
+
+  public static interface SearchView.OnQueryTextListener {
+    method public boolean onQueryTextChange(String!);
+    method public boolean onQueryTextSubmit(String!);
+  }
+
+  public static interface SearchView.OnSuggestionListener {
+    method public boolean onSuggestionClick(int);
+    method public boolean onSuggestionSelect(int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SearchView.SearchAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
+    ctor public SearchView.SearchAutoComplete(android.content.Context!);
+    ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!);
+    ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!, int);
+  }
+
+  public class ShareActionProvider extends androidx.core.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context!);
+    method public android.view.View! onCreateActionView();
+    method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+    method public void setShareHistoryFileName(String!);
+    method public void setShareIntent(android.content.Intent!);
+    field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+    method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+    method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+    method @FloatRange(from=0.0, to=1.0) protected final float getThumbPosition();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public boolean isEmojiCompatEnabled();
+    method public void onMeasure(int, int);
+    method public void setEmojiCompatEnabled(boolean);
+    method protected final void setEnforceSwitchWidth(boolean);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!, int);
+    method public void setSwitchTypeface(android.graphics.Typeface!);
+    method public void setTextOff(CharSequence!);
+    method public void setTextOn(CharSequence!);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setThumbTintList(android.content.res.ColorStateList?);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList?);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  public static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme? getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintTypedArray {
+    method public boolean getBoolean(int, boolean);
+    method @RequiresApi(21) public int getChangingConfigurations();
+    method public int getColor(int, int);
+    method public android.content.res.ColorStateList! getColorStateList(int);
+    method public float getDimension(int, float);
+    method public int getDimensionPixelOffset(int, int);
+    method public int getDimensionPixelSize(int, int);
+    method public android.graphics.drawable.Drawable! getDrawable(int);
+    method public android.graphics.drawable.Drawable! getDrawableIfKnown(int);
+    method public float getFloat(int, float);
+    method public android.graphics.Typeface? getFont(@StyleableRes int, int, androidx.core.content.res.ResourcesCompat.FontCallback?);
+    method public float getFraction(int, int, int, float);
+    method public int getIndex(int);
+    method public int getIndexCount();
+    method public int getInt(int, int);
+    method public int getInteger(int, int);
+    method public int getLayoutDimension(int, String!);
+    method public int getLayoutDimension(int, int);
+    method public String! getNonResourceString(int);
+    method public String! getPositionDescription();
+    method public int getResourceId(int, int);
+    method public android.content.res.Resources! getResources();
+    method public String! getString(int);
+    method public CharSequence! getText(int);
+    method public CharSequence![]! getTextArray(int);
+    method public int getType(int);
+    method public boolean getValue(int, android.util.TypedValue!);
+    method public android.content.res.TypedArray! getWrappedTypeArray();
+    method public boolean hasValue(int);
+    method public int length();
+    method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!);
+    method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!, int, int);
+    method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, int, int[]!);
+    method public android.util.TypedValue! peekValue(int);
+    method public void recycle();
+  }
+
+  public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+    ctor public Toolbar(android.content.Context);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+    method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean canShowOverflowMenu();
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+    method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+    method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.DecorToolbar! getWrapper();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method @MainThread public void invalidateMenu();
+    method public boolean isBackInvokedCallbackEnabled();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+    method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+    method public void setBackInvokedCallbackEnabled(boolean);
+    method public void setCollapseContentDescription(@StringRes int);
+    method public void setCollapseContentDescription(CharSequence?);
+    method public void setCollapseIcon(@DrawableRes int);
+    method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setCollapsible(boolean);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(@DrawableRes int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setLogoDescription(@StringRes int);
+    method public void setLogoDescription(CharSequence!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setNavigationContentDescription(@StringRes int);
+    method public void setNavigationContentDescription(CharSequence?);
+    method public void setNavigationIcon(@DrawableRes int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+    method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+    method public void setPopupTheme(@StyleRes int);
+    method public void setSubtitle(@StringRes int);
+    method public void setSubtitle(CharSequence!);
+    method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setSubtitleTextColor(@ColorInt int);
+    method public void setSubtitleTextColor(android.content.res.ColorStateList);
+    method public void setTitle(@StringRes int);
+    method public void setTitle(CharSequence!);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
+    method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+    method public void setTitleTextColor(@ColorInt int);
+    method public void setTitleTextColor(android.content.res.ColorStateList);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+  }
+
+  public static interface Toolbar.OnMenuItemClickListener {
+    method public boolean onMenuItemClick(android.view.MenuItem!);
+  }
+
+  public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel!);
+    ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+    ctor public Toolbar.SavedState(android.os.Parcelable!);
+    field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ToolbarWidgetWrapper implements androidx.appcompat.widget.DecorToolbar {
+    ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean);
+    ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean, int, int);
+    method public void animateToVisibility(int);
+    method public boolean canShowOverflowMenu();
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method public android.content.Context! getContext();
+    method public android.view.View! getCustomView();
+    method public int getDisplayOptions();
+    method public int getDropdownItemCount();
+    method public int getDropdownSelectedPosition();
+    method public int getHeight();
+    method public android.view.Menu! getMenu();
+    method public int getNavigationMode();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public android.view.ViewGroup! getViewGroup();
+    method public int getVisibility();
+    method public boolean hasEmbeddedTabs();
+    method public boolean hasExpandedActionView();
+    method public boolean hasIcon();
+    method public boolean hasLogo();
+    method public boolean hideOverflowMenu();
+    method public void initIndeterminateProgress();
+    method public void initProgress();
+    method public boolean isOverflowMenuShowPending();
+    method public boolean isOverflowMenuShowing();
+    method public boolean isTitleTruncated();
+    method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+    method public void setCollapsible(boolean);
+    method public void setCustomView(android.view.View!);
+    method public void setDefaultNavigationContentDescription(int);
+    method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setDisplayOptions(int);
+    method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+    method public void setDropdownSelectedPosition(int);
+    method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+    method public void setHomeButtonEnabled(boolean);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable!);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable!);
+    method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+    method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+    method public void setMenuPrepared();
+    method public void setNavigationContentDescription(CharSequence!);
+    method public void setNavigationContentDescription(int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+    method public void setNavigationIcon(int);
+    method public void setNavigationMode(int);
+    method public void setSubtitle(CharSequence!);
+    method public void setTitle(CharSequence!);
+    method public void setVisibility(int);
+    method public void setWindowCallback(android.view.Window.Callback!);
+    method public void setWindowTitle(CharSequence!);
+    method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+    method public boolean showOverflowMenu();
+  }
+
+  public class TooltipCompat {
+    method public static void setTooltipText(android.view.View, CharSequence?);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewStubCompat extends android.view.View {
+    ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?);
+    ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?, int);
+    method public int getInflatedId();
+    method public android.view.LayoutInflater! getLayoutInflater();
+    method public int getLayoutResource();
+    method public android.view.View! inflate();
+    method public void setInflatedId(int);
+    method public void setLayoutInflater(android.view.LayoutInflater!);
+    method public void setLayoutResource(int);
+    method public void setOnInflateListener(androidx.appcompat.widget.ViewStubCompat.OnInflateListener!);
+  }
+
+  public static interface ViewStubCompat.OnInflateListener {
+    method public void onInflate(androidx.appcompat.widget.ViewStubCompat!, android.view.View!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewUtils {
+    method public static void computeFitSystemWindows(android.view.View!, android.graphics.Rect!, android.graphics.Rect!);
+    method public static boolean isLayoutRtl(android.view.View!);
+    method public static void makeOptionalFitsSystemWindows(android.view.View!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WithHint {
+    method public CharSequence? getHint();
+  }
+
+}
+
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index c5bf201..ed904b7 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -20,18 +20,18 @@
     implementation("androidx.core:core-ktx:1.8.0")
     implementation(libs.kotlinStdlib)
 
-    implementation(projectOrArtifact(":emoji2:emoji2"))
-    implementation(projectOrArtifact(":emoji2:emoji2-views-helper"))
+    implementation("androidx.emoji2:emoji2:1.2.0-rc01")
+    implementation("androidx.emoji2:emoji2-views-helper:1.2.0-rc01")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.cursoradapter:cursoradapter:1.0.0")
     api(projectOrArtifact(":activity:activity"))
     api("androidx.fragment:fragment:1.3.6")
     api(project(":appcompat:appcompat-resources"))
     api("androidx.drawerlayout:drawerlayout:1.0.0")
-    implementation("androidx.lifecycle:lifecycle-runtime:2.3.1")
-    implementation("androidx.lifecycle:lifecycle-viewmodel:2.3.1")
+    implementation("androidx.lifecycle:lifecycle-runtime:2.5.1")
+    implementation("androidx.lifecycle:lifecycle-viewmodel:2.5.1")
     implementation("androidx.resourceinspection:resourceinspection-annotation:1.0.1")
-    api("androidx.savedstate:savedstate:1.1.0")
+    api("androidx.savedstate:savedstate:1.2.0")
 
     // Due to experimental annotations used in core.
     compileOnly(libs.kotlinStdlib)
@@ -48,7 +48,7 @@
     androidTestImplementation(libs.espressoCore, excludes.espresso)
     androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has it's own MockMaker
     androidTestImplementation(libs.dexmakerMockito, excludes.bytebuddy) // DexMaker has it's own MockMaker
-    androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.3.1" )
+    androidTestImplementation("androidx.lifecycle:lifecycle-runtime-testing:2.5.1" )
     androidTestImplementation(project(":internal-testutils-runtime"))
     androidTestImplementation(project(":internal-testutils-appcompat"), {
         exclude group: "androidx.appcompat", module: "appcompat"
diff --git a/arch/core/core-testing/lint-baseline.xml b/arch/core/core-testing/lint-baseline.xml
index 0004e63..e4e77e4 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="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/asynclayoutinflater/asynclayoutinflater/proguard-rules.pro b/asynclayoutinflater/asynclayoutinflater/proguard-rules.pro
index de09cba..9928140 100644
--- a/asynclayoutinflater/asynclayoutinflater/proguard-rules.pro
+++ b/asynclayoutinflater/asynclayoutinflater/proguard-rules.pro
@@ -5,3 +5,7 @@
 -dontwarn androidx.appcompat.app.AppCompatViewInflater
 -dontwarn androidx.appcompat.widget.VectorEnabledTintResources
 -dontwarn androidx.appcompat.R
+-dontwarn android.support.v7.app.AppCompatActivity
+-dontwarn android.support.v7.app.AppCompatViewInflater
+-dontwarn android.support.v7.appcompat.R$styleable
+-dontwarn android.support.v7.widget.VectorEnabledTintResources
\ No newline at end of file
diff --git a/benchmark/benchmark-common/lint-baseline.xml b/benchmark/benchmark-common/lint-baseline.xml
deleted file mode 100644
index bbb6ad1..0000000
--- a/benchmark/benchmark-common/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 23 (current min is 14): `getBACKGROUND_SPINNING_PROCESS_NAME`"
-        errorLine1="                BACKGROUND_SPINNING_PROCESS_NAME"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/benchmark/ShellTest.kt"/>
-    </issue>
-
-</issues>
diff --git a/biometric/biometric/lint-baseline.xml b/biometric/biometric/lint-baseline.xml
index 4672a5b..8836527 100644
--- a/biometric/biometric/lint-baseline.xml
+++ b/biometric/biometric/lint-baseline.xml
@@ -2,42 +2,6 @@
 <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="Class requires API level 16 (current min is 14): `android.os.CancellationSignal`"
-        errorLine1="                return mock(android.os.CancellationSignal.class);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/biometric/CancellationSignalProviderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 16 (current min is 14): `getBiometricCancellationSignal`"
-        errorLine1="                provider.getBiometricCancellationSignal();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/biometric/CancellationSignalProviderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 16 (current min is 14): `android.os.CancellationSignal#cancel`"
-        errorLine1="        doThrow(NullPointerException.class).when(biometricSignal).cancel();"
-        errorLine2="                                                                  ~~~~~~">
-        <location
-            file="src/test/java/androidx/biometric/CancellationSignalProviderTest.java"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 16 (current min is 14): `getBiometricCancellationSignal`"
-        errorLine1="        assertThat(provider.getBiometricCancellationSignal()).isNotEqualTo(biometricSignal);"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/test/java/androidx/biometric/CancellationSignalProviderTest.java"/>
-    </issue>
-
-    <issue
         id="WrongConstant"
         message="Must be one of: BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN, BiometricPrompt.AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL, BiometricPrompt.AUTHENTICATION_RESULT_TYPE_BIOMETRIC, but could be BiometricPrompt.AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL, BiometricPrompt.AUTHENTICATION_RESULT_TYPE_BIOMETRIC"
         errorLine1="            return result.getAuthenticationType();"
diff --git a/biometric/integration-tests/testapp/lint-baseline.xml b/biometric/integration-tests/testapp/lint-baseline.xml
deleted file mode 100644
index 1fa304a..0000000
--- a/biometric/integration-tests/testapp/lint-baseline.xml
+++ /dev/null
@@ -1,11 +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="NotificationPermission"
-        message="When targeting Android 13 or higher, posting a permission requires holding the `POST_NOTIFICATIONS` permission (usage from leakcanary.NotificationEventListener)">
-        <location
-            file="$GRADLE_USER_HOME/caches/transforms-3/4366a02f2b10003dc48387e903833c2d/transformed/leakcanary-android-core-2.8.1/jars/classes.jar"/>
-    </issue>
-
-</issues>
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothLeScanner.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothLeScanner.kt
new file mode 100644
index 0000000..a8c0aa2
--- /dev/null
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/BluetoothLeScanner.kt
@@ -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.bluetooth.core
+
+import android.bluetooth.BluetoothAdapter as FwkBluetoothAdapter
+import android.bluetooth.le.ScanCallback as FwkScanCallback
+import android.bluetooth.le.ScanFilter as FwkScanFilter
+import android.bluetooth.le.ScanSettings as FwkScanSettings
+import android.Manifest
+import androidx.annotation.RequiresPermission
+
+/**
+ * This class provides methods to perform scan related operations for Bluetooth LE devices. An
+ * application can scan for a particular type of Bluetooth LE devices using [FwkScanFilter]. It
+ * can also request different types of callbacks for delivering the result.
+ *
+ * Use [FwkBluetoothAdapter.getBluetoothLeScanner] to get an instance of
+ * [BluetoothLeScanner].
+ *
+ * @see FwkScanFilter
+ *
+ * @hide
+ */
+// TODO(ofy) Change FwkScanFilter to core.ScanFilter when it is available
+// TODO(ofy) Change FwkBluetoothAdapter to core.BluetoothAdapter when it is available
+class BluetoothLeScanner(fwkBluetoothAdapter: FwkBluetoothAdapter) {
+
+    companion object {
+        private const val TAG = "BluetoothLeScanner"
+        private const val DBG = true
+        private const val VDBG = false
+
+        /**
+         * Extra containing a list of ScanResults. It can have one or more results if there was no
+         * error. In case of error, [.EXTRA_ERROR_CODE] will contain the error code and this
+         * extra will not be available.
+         */
+        const val EXTRA_LIST_SCAN_RESULT = "android.bluetooth.le.extra.LIST_SCAN_RESULT"
+
+        /**
+         * Optional extra indicating the error code, if any. The error code will be one of the
+         * SCAN_FAILED_* codes in [ScanCallback].
+         */
+        const val EXTRA_ERROR_CODE = "android.bluetooth.le.extra.ERROR_CODE"
+
+        /**
+         * Optional extra indicating the callback type, which will be one of
+         * CALLBACK_TYPE_* constants in [FwkScanSettings].
+         *
+         * @see ScanCallback.onScanResult
+         */
+        // TODO(ofy) Change FwkScanSettings to core.ScanSettings when it is available
+        const val EXTRA_CALLBACK_TYPE = "android.bluetooth.le.extra.CALLBACK_TYPE"
+    }
+
+    private val fwkBluetoothLeScanner = fwkBluetoothAdapter.bluetoothLeScanner
+
+    /**
+     * Start Bluetooth LE scan with default parameters and no filters. The scan results will be
+     * delivered through `callback`. For unfiltered scans, scanning is stopped on screen
+     * off to save power. Scanning is resumed when screen is turned on again. To avoid this, use
+     * [.startScan] with desired [FwkScanFilter].
+     *
+     *
+     * An app must have
+     * [ACCESS_COARSE_LOCATION][android.Manifest.permission.ACCESS_COARSE_LOCATION] permission
+     * in order to get results. An App targeting Android Q or later must have
+     * [ACCESS_FINE_LOCATION][android.Manifest.permission.ACCESS_FINE_LOCATION] permission
+     * in order to get results.
+     *
+     * @param callback Callback used to deliver scan results.
+     * @throws IllegalArgumentException If `callback` is null.
+     */
+    @RequiresPermission(Manifest.permission.BLUETOOTH_SCAN)
+    // TODO(ofy) Change FwkScanCallback to core.ScanCallback when it is available
+    fun startScan(callback: FwkScanCallback) {
+        fwkBluetoothLeScanner.startScan(callback)
+    }
+
+    // TODO(ofy) Add remainder of BluetoothLeScanner
+    // ...
+}
diff --git a/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanSettings.kt b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanSettings.kt
new file mode 100644
index 0000000..df2333a
--- /dev/null
+++ b/bluetooth/bluetooth-core/src/main/java/androidx/bluetooth/core/ScanSettings.kt
@@ -0,0 +1,158 @@
+/*
+ * 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.bluetooth.core
+
+// TODO(ofy) Implement Bundleable instead of Parcelable
+/**
+ * Bluetooth LE scan settings are passed to {@link BluetoothLeScanner#startScan} to define the
+ * parameters for the scan.
+ * @hide
+ */
+class ScanSettings {
+
+    companion object {
+        /**
+         * A special Bluetooth LE scan mode. Applications using this scan mode will passively
+         * listen for other scan results without starting BLE scans themselves.
+         */
+        const val SCAN_MODE_OPPORTUNISTIC = -1
+
+        /**
+         * Perform Bluetooth LE scan in low power mode. This is the default scan mode as it
+         * consumes the least power. This mode is enforced if the scanning application is not in
+         * foreground.
+         */
+        const val SCAN_MODE_LOW_POWER = 0
+
+        /**
+         * Perform Bluetooth LE scan in balanced power mode. Scan results are returned at a rate
+         * that provides a good trade-off between scan frequency and power consumption.
+         */
+        const val SCAN_MODE_BALANCED = 1
+
+        /**
+         * Scan using highest duty cycle. It's recommended to only use this mode when the
+         * application is running in the foreground.
+         */
+        const val SCAN_MODE_LOW_LATENCY = 2
+
+        /**
+         * Perform Bluetooth LE scan in ambient discovery mode. This mode has lower duty cycle
+         * and more aggressive scan interval than balanced mode that provides a good trade-off
+         * between scan latency and power consumption.
+         *
+         * @hide
+         */
+        val SCAN_MODE_AMBIENT_DISCOVERY = 3
+
+        /**
+         * Default Bluetooth LE scan mode when the screen is off.
+         * This mode has the low duty cycle and long scan interval which results in the lowest
+         * power consumption among all modes. It is for the framework internal use only.
+         *
+         * @hide
+         */
+        const val SCAN_MODE_SCREEN_OFF = 4
+
+        /**
+         * Balanced Bluetooth LE scan mode for foreground service when the screen is off.
+         * It is for the framework internal use only.
+         *
+         * @hide
+         */
+        const val SCAN_MODE_SCREEN_OFF_BALANCED = 5
+
+        /**
+         * Trigger a callback for every Bluetooth advertisement found that matches the filter
+         * criteria. If no filter is active, all advertisement packets are reported.
+         */
+        const val CALLBACK_TYPE_ALL_MATCHES = 1
+
+        /**
+         * A result callback is only triggered for the first advertisement packet received that
+         * matches the filter criteria.
+         */
+        const val CALLBACK_TYPE_FIRST_MATCH = 2
+
+        /**
+         * Receive a callback when advertisements are no longer received from a device that has
+         * been previously reported by a first match callback.
+         */
+        const val CALLBACK_TYPE_MATCH_LOST = 4
+        /**
+         * Determines how many advertisements to match per filter, as this is scarce hw resource
+         */
+        /**
+         * Match one advertisement per filter
+         */
+        const val MATCH_NUM_ONE_ADVERTISEMENT = 1
+
+        /**
+         * Match few advertisement per filter, depends on current capability and availability of
+         * the resources in hw
+         */
+        const val MATCH_NUM_FEW_ADVERTISEMENT = 2
+
+        /**
+         * Match as many advertisement per filter as hw could allow, depends on current
+         * capability and availability of the resources in hw
+         */
+        const val MATCH_NUM_MAX_ADVERTISEMENT = 3
+
+        /**
+         * In Aggressive mode, hw will determine a match sooner even with feeble signal strength
+         * and few number of sightings/match in a duration.
+         */
+        const val MATCH_MODE_AGGRESSIVE = 1
+
+        /**
+         * For sticky mode, higher threshold of signal strength and sightings is required
+         * before reporting by hw
+         */
+        const val MATCH_MODE_STICKY = 2
+
+        /**
+         * Request full scan results which contain the device, rssi, advertising data, scan
+         * response as well as the scan timestamp.
+         *
+         * @hide
+         */
+        val SCAN_RESULT_TYPE_FULL = 0
+
+        /**
+         * Request abbreviated scan results which contain the device, rssi and scan timestamp.
+         *
+         *
+         * **Note:** It is possible for an application to get more scan results than it asked
+         * for, if there are multiple apps using this type.
+         *
+         * @hide
+         */
+        val SCAN_RESULT_TYPE_ABBREVIATED = 1
+
+        /**
+         * Use all supported PHYs for scanning.
+         * This will check the controller capabilities, and start
+         * the scan on 1Mbit and LE Coded PHYs if supported, or on
+         * the 1Mbit PHY only.
+         */
+        const val PHY_LE_ALL_SUPPORTED = 255
+    }
+
+    // TODO(ofy) Add remainder of ScanSettings
+    // ...
+}
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt
index 514be15..4384fb4 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.build
 
-import androidx.build.AndroidXPluginTestContext.Companion.fileList
 import androidx.build.AndroidXSelfTestProject.Companion.cubaneBuildGradleText
 import androidx.build.AndroidXSelfTestProject.Companion.cubaneKmpNoJavaProject
 import androidx.build.AndroidXSelfTestProject.Companion.cubaneProject
@@ -32,8 +31,8 @@
         val output = runGradle(":cubane:cubane:createProjectZip", "--stacktrace").output
         Checkmark.checks {
             output.check { it.contains("BUILD SUCCESSFUL") }
-            outDir.check { it.fileList().contains("dist") }
-            outDir.resolve("dist/per-project-zips").fileList()
+            outDir.check { it.filesInFolder().contains("dist") }
+            outDir.resolve("dist/per-project-zips").filesInFolder()
                 .check { it.contains("cubane-cubane-all-0-1.2.3.zip") }
         }
     }
@@ -59,7 +58,7 @@
     fun androidLibraryAndKotlinAndroid() = pluginTest {
         val project = cubaneProject.copy(
             buildGradleText = cubaneBuildGradleText(
-                listOf("com.android.library", "kotlin-android")
+                listOf("com.android.library", "kotlin-android", "AndroidXPlugin")
             )
         )
         writeBuildFiles(project)
@@ -70,7 +69,7 @@
     fun kotlinAndroidAndAndroidLibrary() = pluginTest {
         val project = cubaneProject.copy(
             buildGradleText = cubaneBuildGradleText(
-                listOf("kotlin-android", "com.android.library")
+                plugins = listOf("kotlin-android", "com.android.library", "AndroidXPlugin")
             )
         )
         writeBuildFiles(project)
@@ -81,9 +80,10 @@
     fun androidSampleApplicationWithoutVersion() = pluginTest {
         val project = cubaneProject.copy(
             buildGradleText = cubaneBuildGradleText(
-                pluginsBeforeAndroidX = listOf(
+                plugins = listOf(
                     "com.android.application",
-                    "org.jetbrains.kotlin.android"
+                    "org.jetbrains.kotlin.android",
+                    "AndroidXPlugin"
                 ),
                 version = null
             )
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt
index 3f36a64..aab0030 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContext.kt
@@ -16,7 +16,6 @@
 
 package androidx.build
 
-import androidx.build.AndroidXPluginTestContext.Companion.wrap
 import androidx.testutils.gradle.ProjectSetupRule
 import java.io.File
 import java.lang.AssertionError
@@ -26,9 +25,6 @@
 import org.gradle.testkit.runner.BuildResult
 import org.gradle.testkit.runner.GradleRunner
 import org.junit.rules.TemporaryFolder
-import org.junit.rules.TestRule
-import org.junit.runner.Description
-import org.junit.runners.model.Statement
 
 /**
  * Main entry point for AndroidX plugin tests.
@@ -59,6 +55,9 @@
  * @param setup: Gradle project setup (see [ProjectSetupRule])
  */
 data class AndroidXPluginTestContext(val tmpFolder: TemporaryFolder, val setup: ProjectSetupRule) {
+    // Default empty environment for runGradle (otherwise the host environment leaks through)
+    private val defaultEnv: Map<String, String> = mapOf()
+
     val props = setup.props
     val buildJars = BuildJars(props.buildSrcOutPath)
 
@@ -72,10 +71,9 @@
 
     fun runGradle(
         vararg args: String,
+        env: Map<String, String> = defaultEnv,
         buildAction: GradleRunAction = defaultBuildAction
     ): BuildResult {
-        // Empty environment so that the host environment does not leak through
-        val env = mapOf<String, String>()
         return GradleRunner.create().withProjectDir(supportRoot)
             .withArguments(
                 "-Dmaven.repo.local=$mavenLocalDir",
@@ -90,7 +88,12 @@
     private fun checkNoClassloaderErrors(result: BuildResult) {
         // We're seeing b/237103195 flakily.  When we do, let's grab additional debugging info.
         val className = "androidx.build.gradle.ExtensionsKt"
-        if (result.output.contains("java.lang.ClassNotFoundException: $className")) {
+        val classNotFound = "java.lang.ClassNotFoundException: $className"
+
+        val mpe = "groovy.lang.MissingPropertyException"
+        val propertyMissing = "$mpe: Could not get unknown property 'androidx' for root project"
+        val messages = listOf(classNotFound, propertyMissing)
+        if (messages.any { result.output.contains(it) }) {
             buildString {
                 appendLine("classloader error START")
                 append(result.output)
@@ -198,7 +201,7 @@
     }
 
     fun AndroidXSelfTestProject.readPublishedFile(fileName: String) =
-        mavenLocalDir.resolve("$groupId/$artifactId/$version/$fileName").readText()
+        mavenLocalDir.resolve("$groupId/$artifactId/$version/$fileName").assertExists().readText()
 
     var printBuildFileOnFailure: Boolean = false
 
@@ -218,20 +221,4 @@
             }
         }.toString()
     }
-
-    companion object {
-        /**
-         * JUnit 4 [TestRule]s are traditionally added to a test class as public JVM fields
-         * with a @[org.junit.Rule] annotation.  This works decently in Java, but has drawbacks,
-         * such as requiring all methods in a test class to be subject to the same [TestRule]s, and
-         * making it difficult to configure [TestRule]s in different ways between test methods.
-         * With lambdas, objects that have been built as [TestRule] can use this extension function
-         * to allow per-method custom application.
-         */
-        fun <T : TestRule> T.wrap(fn: (T) -> Unit) = apply(object : Statement() {
-            override fun evaluate() = fn(this@wrap)
-        }, Description.EMPTY).evaluate()
-
-        fun File.fileList() = list()!!.toList()
-    }
 }
\ No newline at end of file
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt
index e3e4d66..a7405bc 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXPluginTestContextTest.kt
@@ -41,6 +41,20 @@
         }
     }
 
+    @Test
+    fun betterDebuggingForPropertyIssues() = pluginTest {
+        thrown {
+            runGradle("") {
+                val mpe = "groovy.lang.MissingPropertyException"
+                val output = "$mpe: Could not get unknown property 'androidx' for root project"
+                buildResult(output)
+            }
+        }!!.check {
+            // Since we're faking this error, we expect that the class is actually there in the jar
+            it.message!!.contains("androidx/build/gradle/ExtensionsKt.class")
+        }
+    }
+
     private fun buildResult(output: String) = DefaultBuildResult(output, listOf())
 
     private fun thrown(action: () -> Unit): Throwable? {
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt
index bb8f4eb..f5550f2 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXRootPluginTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.build
 
-import androidx.build.AndroidXPluginTestContext.Companion.fileList
 import androidx.build.AndroidXSelfTestProject.Companion.cubaneKmpProject
 import androidx.build.AndroidXSelfTestProject.Companion.cubaneProject
 import net.saff.checkmark.Checkmark.Companion.check
@@ -90,7 +89,7 @@
 
         val where = tmpFolder.newFolder()
         saveMavenFoldersForDebugging(where.path)
-        where.fileList().check { it.contains("cubane") }
+        where.filesInFolder().check { it.contains("cubane") }
     }
 
     @Test
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt
index b814f9a..d29af2c 100644
--- a/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/AndroidXSelfTestProject.kt
@@ -27,9 +27,8 @@
     val sourceCoordinate get() = "$groupId:$artifactId:${version!!}"
 
     companion object {
-        // TODO(b/233089408): avoid full path for androidx.build.AndroidXImplPlugin
         fun cubaneBuildGradleText(
-            pluginsBeforeAndroidX: List<String> = listOf("java-library", "kotlin"),
+            plugins: List<String> = listOf("java-library", "kotlin", "AndroidXPlugin"),
             version: String? = "1.2.3"
         ): String {
             val mavenVersionLine = if (version != null) {
@@ -42,8 +41,7 @@
                       |import androidx.build.Version
                       |
                       |plugins {
-                      |${pluginsBeforeAndroidX.joinToString("") { "  id(\"$it\")\n" }}
-                      |  id("AndroidXPlugin")
+                      |${plugins.joinToString("") { "  id(\"$it\")\n" }}
                       |}
                       |
                       |dependencies {
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/buildTests.kt b/buildSrc-tests/src/test/kotlin/androidx/build/buildTests.kt
new file mode 100644
index 0000000..d0ece3b
--- /dev/null
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/buildTests.kt
@@ -0,0 +1,52 @@
+/*
+ * 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.build
+
+import java.io.File
+import java.io.IOException
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+/**
+ * JUnit 4 [TestRule]s are traditionally added to a test class as public JVM fields
+ * with a @[org.junit.Rule] annotation.  This works decently in Java, but has drawbacks,
+ * such as requiring all methods in a test class to be subject to the same [TestRule]s, and
+ * making it difficult to configure [TestRule]s in different ways between test methods.
+ * With lambdas, objects that have been built as [TestRule] can use this extension function
+ * to allow per-method custom application.
+ */
+fun <T : TestRule> T.wrap(fn: (T) -> Unit) = apply(object : Statement() {
+    override fun evaluate() = fn(this@wrap)
+}, Description.EMPTY).evaluate()
+
+fun File.filesInFolder() = list()!!.toList()
+
+fun File.assertExists(): File {
+    if (exists()) {
+        return this
+    }
+    var youngestMissingSoFar = this
+    while (!youngestMissingSoFar.parentFile.exists()) {
+        youngestMissingSoFar = youngestMissingSoFar.parentFile
+    }
+    val missing = youngestMissingSoFar
+    val actualFiles = missing.parentFile.filesInFolder()
+    throw IOException(
+        "Could not read $this.  ${missing.parent} has $actualFiles but not ${missing.name}"
+    )
+}
\ No newline at end of file
diff --git a/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/BuildInfoTest.kt b/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/BuildInfoTest.kt
new file mode 100644
index 0000000..d7fae0d
--- /dev/null
+++ b/buildSrc-tests/src/test/kotlin/androidx/build/integrationtests/BuildInfoTest.kt
@@ -0,0 +1,69 @@
+/*
+ * 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.build.integrationtests
+
+import androidx.build.AndroidXPluginTestContext
+import androidx.build.AndroidXSelfTestProject
+import androidx.build.assertExists
+import androidx.build.pluginTest
+import androidx.build.writeBuildFiles
+import net.saff.checkmark.Checkmark.Companion.check
+import org.junit.Test
+
+class BuildInfoTest {
+    @Test
+    fun androidLibraryBuildInfoTasks() = pluginTest {
+        val env = environmentForExplicitChangeInfo()
+
+        writeBuildFiles(
+            AndroidXSelfTestProject.cubaneProject.copy(
+                buildGradleText = AndroidXSelfTestProject.cubaneBuildGradleText(
+                    plugins = listOf("com.android.library", "AndroidXPlugin")
+                )
+            )
+        )
+
+        // Run to generate build_info file to examine.
+        runGradle(":cubane:cubane:createLibraryBuildInfoFiles", "--stacktrace", env = env)
+
+        // Generated by command above.  See CreateLibraryBuildInfoFileTask doc for derivation
+        // of filename
+        val buildInfoPath = "dist/build-info/cubane_cubane_build_info.txt"
+        outDir.resolve(buildInfoPath).assertExists().readText().check {
+            it.contains("\"artifactId\": \"cubane\"")
+        }
+    }
+
+    /**
+     * Avoid calling git in tests by taking advantage of environment variables with changelist info
+     * and manifest of changed files.  (These are usually set by busytown and detected in our
+     * builds, cf b/203692753)
+     */
+    private fun AndroidXPluginTestContext.environmentForExplicitChangeInfo(): Map<String, String> {
+        val gitChangeFilesDir = tmpFolder.newFolder()
+        val gitChangeInfoFilename = gitChangeFilesDir.resolve("CHANGE_INFO").apply {
+            writeText("{}")
+        }
+        val gitManifestFilename = gitChangeFilesDir.resolve("MANIFEST").apply {
+            writeText("path=\"frameworks/support\" revision=\"testRev\" ")
+        }
+        return mapOf(
+            "CHANGE_INFO" to gitChangeInfoFilename.path,
+            "MANIFEST" to gitManifestFilename.path
+        )
+    }
+}
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
index c9aaed7..46f55a3 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
@@ -162,6 +162,7 @@
                     error.add("UnnecessaryComposedModifier")
                     error.add("FrequentlyChangedStateReadInComposition")
                     error.add("ReturnFromAwaitPointerEventScope")
+                    error.add("UseOfNonLambdaOffsetOverload")
 
                     // Paths we want to enable ListIterator checks for - for higher level
                     // libraries it won't have a noticeable performance impact, and we don't want
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index 6d34274..f1067803 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -25,8 +25,7 @@
 import androidx.build.SupportConfig.DEFAULT_MIN_SDK_VERSION
 import androidx.build.SupportConfig.INSTRUMENTATION_RUNNER
 import androidx.build.SupportConfig.TARGET_SDK_VERSION
-import androidx.build.buildInfo.CreateAggregateLibraryBuildInfoFileTask
-import androidx.build.buildInfo.CreateLibraryBuildInfoFileTask
+import androidx.build.buildInfo.addCreateLibraryBuildInfoFileTask
 import androidx.build.checkapi.JavaApiTaskConfig
 import androidx.build.checkapi.KmpApiTaskConfig
 import androidx.build.checkapi.LibraryApiTaskConfig
@@ -185,8 +184,6 @@
     }
 
     private fun configureTestTask(project: Project, task: Test) {
-        AffectedModuleDetector.configureTaskGuard(task)
-
         // Robolectric 1.7 increased heap size requirements, see b/207169653.
         task.maxHeapSize = "3g"
 
@@ -275,7 +272,9 @@
     ) {
         project.afterEvaluate {
             project.tasks.withType(KotlinCompile::class.java).configureEach { task ->
-                if (extension.type.compilationTarget == CompilationTarget.HOST) {
+                if (extension.type.compilationTarget == CompilationTarget.HOST &&
+                    extension.type != LibraryType.ANNOTATION_PROCESSOR_UTILS
+                ) {
                     task.kotlinOptions.jvmTarget = "11"
                 } else {
                     task.kotlinOptions.jvmTarget = "1.8"
@@ -458,7 +457,9 @@
         // Force Java 1.8 source- and target-compatibility for all Java libraries.
         val javaExtension = project.extensions.getByType<JavaPluginExtension>()
         project.afterEvaluate {
-            if (extension.type.compilationTarget == CompilationTarget.HOST) {
+            if (extension.type.compilationTarget == CompilationTarget.HOST &&
+                extension.type != LibraryType.ANNOTATION_PROCESSOR_UTILS
+            ) {
                 javaExtension.apply {
                     sourceCompatibility = VERSION_11
                     targetCompatibility = VERSION_11
@@ -674,6 +675,8 @@
                 addToTestZips(project, packageTask)
             }
         }
+        // This task needs to be guarded by AffectedModuleDetector due to guarding test
+        // APK building above. It can only be removed if we stop using AMD for test APKs.
         project.tasks.withType(ListingFileRedirectTask::class.java).forEach {
             AffectedModuleDetector.configureTaskGuard(it)
         }
@@ -835,39 +838,10 @@
         }
     }
 
-    // Task that creates a json file of a project's dependencies
-    private fun Project.addCreateLibraryBuildInfoFileTask(extension: AndroidXExtension) {
-        afterEvaluate {
-            if (extension.shouldRelease()) {
-                // Only generate build info files for published libraries.
-                val task = CreateLibraryBuildInfoFileTask.setup(project, extension)
-
-                rootProject.tasks.named(CreateLibraryBuildInfoFileTask.TASK_NAME).configure {
-                    it.dependsOn(task)
-                }
-                addTaskToAggregateBuildInfoFileTask(task)
-            }
-        }
-    }
-
-    private fun Project.addTaskToAggregateBuildInfoFileTask(
-        task: TaskProvider<CreateLibraryBuildInfoFileTask>
-    ) {
-        rootProject.tasks.named(CREATE_AGGREGATE_BUILD_INFO_FILES_TASK).configure {
-            val aggregateLibraryBuildInfoFileTask: CreateAggregateLibraryBuildInfoFileTask = it
-                as CreateAggregateLibraryBuildInfoFileTask
-            aggregateLibraryBuildInfoFileTask.dependsOn(task)
-            aggregateLibraryBuildInfoFileTask.libraryBuildInfoFiles.add(
-                task.flatMap { task -> task.outputFile }
-            )
-        }
-    }
-
     companion object {
         const val BUILD_TEST_APKS_TASK = "buildTestApks"
         const val CHECK_RELEASE_READY_TASK = "checkReleaseReady"
         const val CREATE_LIBRARY_BUILD_INFO_FILES_TASK = "createLibraryBuildInfoFiles"
-        const val CREATE_AGGREGATE_BUILD_INFO_FILES_TASK = "createAggregateBuildInfoFiles"
         const val GENERATE_TEST_CONFIGURATION_TASK = "GenerateTestConfiguration"
         const val ZIP_TEST_CONFIGS_WITH_APKS_TASK = "zipTestConfigsWithApks"
         const val ZIP_CONSTRAINED_TEST_CONFIGS_WITH_APKS_TASK = "zipConstrainedTestConfigsWithApks"
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
index d406a34..aad479ab 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
@@ -19,6 +19,7 @@
 import androidx.build.AndroidXImplPlugin.Companion.ZIP_CONSTRAINED_TEST_CONFIGS_WITH_APKS_TASK
 import androidx.build.AndroidXImplPlugin.Companion.ZIP_TEST_CONFIGS_WITH_APKS_TASK
 import androidx.build.buildInfo.CreateAggregateLibraryBuildInfoFileTask
+import androidx.build.buildInfo.CreateAggregateLibraryBuildInfoFileTask.Companion.CREATE_AGGREGATE_BUILD_INFO_FILES_TASK
 import androidx.build.dependencyTracker.AffectedModuleDetector
 import androidx.build.gradle.isRoot
 import androidx.build.license.CheckExternalDependencyLicensesTask
@@ -88,7 +89,7 @@
         buildOnServerTask.buildId = getBuildId()
         buildOnServerTask.dependsOn(
             tasks.register(
-                AndroidXImplPlugin.CREATE_AGGREGATE_BUILD_INFO_FILES_TASK,
+                CREATE_AGGREGATE_BUILD_INFO_FILES_TASK,
                 CreateAggregateLibraryBuildInfoFileTask::class.java
             )
         )
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index 26234ab..2cb6b2c 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -16,7 +16,6 @@
 
 package androidx.build
 
-import androidx.build.dependencyTracker.AffectedModuleDetector
 import com.android.build.api.dsl.Lint
 import com.android.build.gradle.internal.lint.AndroidLintAnalysisTask
 import com.android.build.gradle.internal.lint.AndroidLintTask
@@ -55,18 +54,6 @@
 
     // Create fake variant tasks since that is what is invoked by developers.
     val lintTask = tasks.named("lint")
-    lintTask.configure { task ->
-        AffectedModuleDetector.configureTaskGuard(task)
-    }
-    afterEvaluate {
-        tasks.named("lintAnalyze").configure { task ->
-            AffectedModuleDetector.configureTaskGuard(task)
-        }
-        /* TODO: uncomment when we upgrade to AGP 7.1.0-alpha04
-        tasks.named("lintReport").configure { task ->
-            AffectedModuleDetector.configureTaskGuard(task)
-        }*/
-    }
     tasks.register("lintDebug") {
         it.dependsOn(lintTask)
         it.enabled = false
@@ -102,28 +89,6 @@
         // We already run lintDebug, we don't need to run lint which lints the release variant
         task.enabled = false
     }
-    afterEvaluate {
-        for (variant in project.agpVariants) {
-            tasks.named(
-                "lint${variant.name.replaceFirstChar {
-                    if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString()
-                }}"
-            ).configure { task ->
-                AffectedModuleDetector.configureTaskGuard(task)
-            }
-            tasks.named(
-                "lintAnalyze${variant.name.replaceFirstChar {
-                    if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString()
-                }}"
-            ).configure { task ->
-                AffectedModuleDetector.configureTaskGuard(task)
-            }
-            /* TODO: uncomment when we upgrade to AGP 7.1.0-alpha04
-            tasks.named("lintReport${variant.name.capitalize(Locale.US)}").configure { task ->
-                AffectedModuleDetector.configureTaskGuard(task)
-            }*/
-        }
-    }
 }
 
 private fun Project.setUpLintDebugIfNeeded() {
@@ -177,7 +142,9 @@
         if (task.name.startsWith("updateLintBaseline")) {
             task.doLast {
                 task.outputs.files.find { it.name == "lint-baseline.xml" }?.let { file ->
-                    file.writeText(removeLineAndColumnAttributes(file.readText()))
+                    if (file.exists()) {
+                        file.writeText(removeLineAndColumnAttributes(file.readText()))
+                    }
                 }
             }
         }
@@ -226,9 +193,6 @@
         disable.add("ReservedSystemPermission")
         disable.add("SystemPermissionTypo")
 
-        // Reenable after b/235251897 is resolved
-        disable.add("IllegalExperimentalApiUsage")
-
         // Disable dependency checks that suggest to change them. We want libraries to be
         // intentional with their dependency version bumps.
         disable.add("KtxExtensionAvailable")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
index 2952d1a..afc0024 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/ListTaskOutputsTask.kt
@@ -42,6 +42,9 @@
     init {
         group = "Help"
         outputs.upToDateWhen { false }
+        notCompatibleWithConfigurationCache(
+            "This task uses project object to inspect outputs of all tasks"
+        )
     }
 
     fun setOutput(f: File) {
@@ -122,37 +125,6 @@
     "generateReleaseProtos",
     // Release APKs
     "copyReleaseApk",
-    // b/223733695
-    "pixel2api31DebugAndroidTest",
-    "pixel2api31ReleaseAndroidTest",
-    "pixel2api31WithExpandProjectionDebugAndroidTest",
-    "pixel2api31WithNullAwareTypeConverterDebugAndroidTest",
-    "pixel2api31WithoutExpandProjectionDebugAndroidTest",
-    "pixel2api31WithKaptDebugAndroidTest",
-    "pixel2api31WithKspDebugAndroidTest",
-    "pixel2api31TargetSdk29DebugAndroidTest",
-    "pixel2api31TargetSdk30DebugAndroidTest",
-    "pixel2api31TargetSdkLatestDebugAndroidTest",
-    "pixel2api30DebugAndroidTest",
-    "pixel2api30ReleaseAndroidTest",
-    "pixel2api30WithExpandProjectionDebugAndroidTest",
-    "pixel2api30WithNullAwareTypeConverterDebugAndroidTest",
-    "pixel2api30WithoutExpandProjectionDebugAndroidTest",
-    "pixel2api30WithKaptDebugAndroidTest",
-    "pixel2api30WithKspDebugAndroidTest",
-    "pixel2api30TargetSdk29DebugAndroidTest",
-    "pixel2api30TargetSdk30DebugAndroidTest",
-    "pixel2api30TargetSdkLatestDebugAndroidTest",
-    "pixel2api29DebugAndroidTest",
-    "pixel2api29ReleaseAndroidTest",
-    "pixel2api29WithExpandProjectionDebugAndroidTest",
-    "pixel2api29WithNullAwareTypeConverterDebugAndroidTest",
-    "pixel2api29WithoutExpandProjectionDebugAndroidTest",
-    "pixel2api29WithKaptDebugAndroidTest",
-    "pixel2api29WithKspDebugAndroidTest",
-    "pixel2api29TargetSdk29DebugAndroidTest",
-    "pixel2api29TargetSdk30DebugAndroidTest",
-    "pixel2api29TargetSdkLatestDebugAndroidTest",
 )
 
 val taskTypesKnownToDuplicateOutputs = setOf(
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateAggregateLibraryBuildInfoFileTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateAggregateLibraryBuildInfoFileTask.kt
index ef6b47f..7e7ac69 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateAggregateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateAggregateLibraryBuildInfoFileTask.kt
@@ -16,17 +16,19 @@
 
 package androidx.build.buildInfo
 
+import androidx.build.buildInfo.CreateAggregateLibraryBuildInfoFileTask.Companion.CREATE_AGGREGATE_BUILD_INFO_FILES_TASK
 import androidx.build.getDistributionDirectory
 import androidx.build.jetpad.LibraryBuildInfoFile
 import com.google.gson.Gson
+import java.io.File
 import org.gradle.api.DefaultTask
+import org.gradle.api.Project
 import org.gradle.api.provider.ListProperty
 import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.OutputFile
 import org.gradle.api.tasks.TaskAction
+import org.gradle.api.tasks.TaskProvider
 import org.gradle.work.DisableCachingByDefault
-import java.io.File
-import java.util.ArrayList
 
 /**
  * Task for a json file of all dependencies for each artifactId
@@ -105,4 +107,19 @@
             throw RuntimeException("JSON written to $outputFile was invalid.")
         }
     }
+
+    companion object {
+        const val CREATE_AGGREGATE_BUILD_INFO_FILES_TASK = "createAggregateBuildInfoFiles"
+    }
+}
+
+fun Project.addTaskToAggregateBuildInfoFileTask(
+    task: TaskProvider<CreateLibraryBuildInfoFileTask>
+) {
+    rootProject.tasks.named(CREATE_AGGREGATE_BUILD_INFO_FILES_TASK).configure {
+        val aggregateLibraryBuildInfoFileTask = it as CreateAggregateLibraryBuildInfoFileTask
+        aggregateLibraryBuildInfoFileTask.libraryBuildInfoFiles.add(
+            task.flatMap { task -> task.outputFile }
+        )
+    }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
index 5c145f8..fc1f69c 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/CreateLibraryBuildInfoFileTask.kt
@@ -17,6 +17,8 @@
 package androidx.build.buildInfo
 
 import androidx.build.AndroidXExtension
+import androidx.build.LibraryGroup
+import androidx.build.buildInfo.CreateLibraryBuildInfoFileTask.Companion.getFrameworksSupportCommitShaAtHead
 import androidx.build.getBuildInfoDirectory
 import androidx.build.getGroupZipPath
 import androidx.build.getProjectZipPath
@@ -26,24 +28,36 @@
 import androidx.build.gitclient.GitCommitRange
 import androidx.build.jetpad.LibraryBuildInfoFile
 import com.google.gson.GsonBuilder
+import java.io.File
 import org.gradle.api.DefaultTask
 import org.gradle.api.Project
+import org.gradle.api.artifacts.Dependency
 import org.gradle.api.artifacts.ProjectDependency
 import org.gradle.api.provider.ListProperty
 import org.gradle.api.provider.Property
+import org.gradle.api.provider.Provider
 import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.Optional
 import org.gradle.api.tasks.OutputFile
 import org.gradle.api.tasks.TaskAction
 import org.gradle.api.tasks.TaskProvider
 import org.gradle.work.DisableCachingByDefault
-import java.io.File
 import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
 
 /**
  * This task generates a library build information file containing the artifactId, groupId, and
  * version of public androidx dependencies and release checklist of the library for consumption
  * by the Jetpack Release Service (JetPad).
+ *
+ * Example:
+ * If this task is configured
+ * - for a project with group name "myGroup"
+ * - on a variant with artifactId "myArtifact",
+ * - and root project outDir is "out"
+ * - and environment variable DIST_DIR is not set
+ *
+ * then the build info file will be written to
+ * "out/dist/build-info/myGroup_myArtifact_build_info.txt"
  */
 @DisableCachingByDefault(because = "uses git sha as input")
 abstract class CreateLibraryBuildInfoFileTask : DefaultTask() {
@@ -84,8 +98,7 @@
     abstract val projectZipPath: Property<String>
 
     @get:Input
-    val dependencyList: ListProperty<LibraryBuildInfoFile.Dependency> =
-        project.objects.listProperty(LibraryBuildInfoFile.Dependency::class.java)
+    abstract val dependencyList: ListProperty<LibraryBuildInfoFile.Dependency>
 
     /**
      * the local project directory without the full framework/support root directory path
@@ -151,21 +164,23 @@
 
         fun setup(
             project: Project,
-            extension: AndroidXExtension
+            mavenGroup: LibraryGroup?,
+            variant: VariantPublishPlan,
+            shaProvider: Provider<String>
         ): TaskProvider<CreateLibraryBuildInfoFileTask> {
             return project.tasks.register(
-                TASK_NAME,
+                TASK_NAME + variant.taskSuffix,
                 CreateLibraryBuildInfoFileTask::class.java
             ) { task ->
                 val group = project.group.toString()
-                val name = project.name.toString()
+                val artifactId = variant.artifactId
                 task.outputFile.set(
                     File(
                         project.getBuildInfoDirectory(),
-                        "${group}_${name}_build_info.txt"
+                        "${group}_${artifactId}_build_info.txt"
                     )
                 )
-                task.artifactId.set(name)
+                task.artifactId.set(artifactId)
                 task.groupId.set(group)
                 task.version.set(project.version.toString())
                 task.kotlinVersion.set(project.getKotlinPluginVersion())
@@ -174,12 +189,8 @@
                         project.getSupportRootFolder().absolutePath
                     )
                 )
-                task.commit.set(
-                    project.provider {
-                        project.getFrameworksSupportCommitShaAtHead()
-                    }
-                )
-                task.groupIdRequiresSameVersion.set(extension.mavenGroup?.requireSameVersion)
+                task.commit.set(shaProvider)
+                task.groupIdRequiresSameVersion.set(mavenGroup?.requireSameVersion)
                 task.groupZipPath.set(project.getGroupZipPath())
                 task.projectZipPath.set(project.getProjectZipPath())
 
@@ -192,39 +203,31 @@
                         project.getSupportRootFolder().absolutePath
                     )
                 )
-                task.dependencyList.set(project.provider {
-                    val libraryDependencies = HashSet<LibraryBuildInfoFile.Dependency>()
-                    project.configurations.filter {
-                        it.name == "releaseRuntimeElements"
-                    }.forEach { configuration ->
-                        configuration.allDependencies.forEach { dep ->
-                            // Only consider androidx dependencies
-                            if (dep.group != null &&
-                                dep.group.toString().startsWith("androidx.") &&
-                                !dep.group.toString().startsWith("androidx.test")
-                            ) {
-                                val androidXPublishedDependency =
-                                    LibraryBuildInfoFile.Dependency()
-                                androidXPublishedDependency.artifactId = dep.name.toString()
-                                androidXPublishedDependency.groupId = dep.group.toString()
-                                androidXPublishedDependency.version = dep.version.toString()
-                                androidXPublishedDependency.isTipOfTree =
-                                    dep is ProjectDependency
-                                libraryDependencies.add(androidXPublishedDependency)
-                            }
-                        }
-                    }
-                    ArrayList(libraryDependencies).sortedWith(
-                        compareBy({ it.groupId }, { it.artifactId }, { it.version })
-                    )
-                })
+
+                // lazily compute the task dependency list based on the variant dependencies.
+                task.dependencyList.set(variant.dependencies.map { it.asBuildInfoDependencies() })
             }
         }
 
+        fun List<Dependency>.asBuildInfoDependencies() =
+            filter { it.group.isAndroidXDependency() }.map {
+                LibraryBuildInfoFile.Dependency().apply {
+                    this.artifactId = it.name.toString()
+                    this.groupId = it.group.toString()
+                    this.version = it.version.toString()
+                    this.isTipOfTree = it is ProjectDependency
+                }
+            }.toHashSet().sortedWith(
+                compareBy({ it.groupId }, { it.artifactId }, { it.version })
+            )
+
+        private fun String?.isAndroidXDependency() =
+            this != null && startsWith("androidx.") && !startsWith("androidx.test")
+
         /* For androidx release notes, the most common use case is to track and publish the last sha
          * of the build that is released.  Thus, we use frameworks/support to get the sha
          */
-        private fun Project.getFrameworksSupportCommitShaAtHead(): String {
+        fun Project.getFrameworksSupportCommitShaAtHead(): String {
             val gitClient = GitClient.create(
                 project.getSupportRootFolder(),
                 logger,
@@ -249,3 +252,30 @@
         }
     }
 }
+
+// Task that creates a json file of a project's dependencies
+fun Project.addCreateLibraryBuildInfoFileTask(extension: AndroidXExtension) {
+    afterEvaluate {
+        if (extension.shouldRelease()) {
+            // Only generate build info files for published libraries.
+            val task = CreateLibraryBuildInfoFileTask.setup(
+                project,
+                extension.mavenGroup,
+                VariantPublishPlan(
+                    artifactId = project.name.toString(),
+                    dependencies = project.provider {
+                        val config = project.configurations.findByName("releaseRuntimeElements")
+                        config?.allDependencies.orEmpty().toList()
+                    }),
+                project.provider {
+                    project.getFrameworksSupportCommitShaAtHead()
+                }
+            )
+
+            rootProject.tasks.named(CreateLibraryBuildInfoFileTask.TASK_NAME).configure {
+                it.dependsOn(task)
+            }
+            addTaskToAggregateBuildInfoFileTask(task)
+        }
+    }
+}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/VariantPublishPlan.kt b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/VariantPublishPlan.kt
new file mode 100644
index 0000000..058f830
--- /dev/null
+++ b/buildSrc/private/src/main/kotlin/androidx/build/buildInfo/VariantPublishPlan.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.build.buildInfo
+
+import org.gradle.api.artifacts.Dependency
+import org.gradle.api.provider.Provider
+
+/**
+ * Info about a particular variant that will be published
+ *
+ * @param artifactId the maven artifact id
+ * @param taskSuffix if non-null, will be added to the end of task names to disambiguate
+ *                   (i.e. createLibraryBuildInfoFiles becomes createLibraryBuildInfoFilesJvm)
+ * @param dependencies provider that will return the dependencies of this variant when/if needed
+ */
+data class VariantPublishPlan(
+    val artifactId: String,
+    val taskSuffix: String = "",
+    val dependencies: Provider<List<Dependency>>
+)
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt
index 61f76fd..e54e24b 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dackka/GenerateMetadataTask.kt
@@ -18,22 +18,25 @@
 
 import java.io.File
 import org.gradle.api.DefaultTask
+import org.gradle.api.artifacts.component.ComponentArtifactIdentifier
+import org.gradle.api.artifacts.component.ModuleComponentIdentifier
 import org.gradle.api.file.RegularFileProperty
 import org.gradle.api.provider.ListProperty
 import org.gradle.api.tasks.CacheableTask
 import org.gradle.api.tasks.Input
 import org.gradle.api.tasks.OutputFile
 import org.gradle.api.tasks.TaskAction
+import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier
 import org.json.JSONArray
 
 @CacheableTask
 abstract class GenerateMetadataTask : DefaultTask() {
 
     /**
-     * List of [MetadataEntry] objects to convert to JSON
+     * List of artifacts to convert to JSON
      */
-    @get:Input
-    abstract val metadataEntries: ListProperty<MetadataEntry>
+    @Input
+    abstract fun getArtifactIds(): ListProperty<ComponentArtifactIdentifier>
 
     /**
      * Location of the generated JSON file
@@ -43,7 +46,28 @@
 
     @TaskAction
     fun generate() {
-        val jsonMapping = generateJsonMapping(metadataEntries)
+        val entries = arrayListOf<MetadataEntry>()
+        getArtifactIds().get().forEach { id ->
+
+            // Only process artifact if it can be cast to ModuleComponentIdentifier.
+            //
+            // In practice, metadata is generated only for docs-public and not docs-tip-of-tree
+            // (where id.componentIdentifier is DefaultProjectComponentIdentifier).
+            if (id.componentIdentifier !is DefaultModuleComponentIdentifier) return@forEach
+
+            // Created https://github.com/gradle/gradle/issues/21415 to track surfacing
+            // group / module / version in ComponentIdentifier
+            val componentId = (id.componentIdentifier as ModuleComponentIdentifier)
+            val entry = MetadataEntry(
+                groupId = componentId.group,
+                artifactId = componentId.module,
+                releaseNotesUrl = generateReleaseNotesUrl(componentId.group),
+                sourceDir = "TBD/SOURCE/DIR" // TODO: fetch from JAR file
+            )
+            entries.add(entry)
+        }
+
+        val jsonMapping = generateJsonMapping(entries)
         val json = JSONArray(jsonMapping)
 
         val outputFile = File(destinationFile.get().toString())
@@ -54,8 +78,15 @@
      * Converts a list of [MetadataEntry] objects into a list of maps.
      */
     private fun generateJsonMapping(
-        metadataEntries: ListProperty<MetadataEntry>
+        metadataEntries: List<MetadataEntry>
     ): List<Map<String, String>> {
-        return metadataEntries.get().map { it.toMap() }
+        return metadataEntries.map { it.toMap() }
+    }
+
+    // TODO move to MetadataEntry + write test after MetadataEntry refactor
+    private fun generateReleaseNotesUrl(group: String): String {
+        // Example: androidx.arch.core => arch-core
+        val library = group.removePrefix("androidx.").replace(".", "-")
+        return "https://developer.android.com/jetpack/androidx/releases/$library"
     }
 }
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
index eab7764..6d266cc 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
@@ -19,7 +19,6 @@
 import androidx.build.SupportConfig
 import androidx.build.dackka.DackkaTask
 import androidx.build.dackka.GenerateMetadataTask
-import androidx.build.dackka.MetadataEntry
 import androidx.build.dependencies.KOTLIN_VERSION
 import androidx.build.doclava.DacOptions
 import androidx.build.doclava.DoclavaTask
@@ -46,6 +45,8 @@
 import org.gradle.api.artifacts.ComponentMetadataContext
 import org.gradle.api.artifacts.ComponentMetadataRule
 import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.component.ComponentArtifactIdentifier
+import org.gradle.api.artifacts.result.ResolvedArtifactResult
 import org.gradle.api.attributes.Attribute
 import org.gradle.api.attributes.Category
 import org.gradle.api.attributes.DocsType
@@ -143,7 +144,8 @@
             unzippedSamplesSources,
             unzipSamplesTask,
             dependencyClasspath,
-            buildOnServer
+            buildOnServer,
+            docsSourcesConfiguration,
         )
         configureDokka(
             project,
@@ -349,7 +351,8 @@
         unzippedSamplesSources: File,
         unzipSamplesTask: TaskProvider<Sync>,
         dependencyClasspath: FileCollection,
-        buildOnServer: TaskProvider<*>
+        buildOnServer: TaskProvider<*>,
+        docsConfiguration: Configuration
     ) {
         val generatedDocsDir = project.file("${project.buildDir}/dackkaDocs")
 
@@ -361,7 +364,20 @@
             "generateMetadata",
             GenerateMetadataTask::class.java
         ) { task ->
-            task.metadataEntries.set(gatherMetadataEntries())
+
+            @Suppress("UnstableApiUsage") // getResolvedArtifacts() is marked @Incubating
+            val artifacts = docsConfiguration.incoming.artifacts.resolvedArtifacts
+            task.getArtifactIds().set(
+
+                /**
+                 * Transforms the Set of [ResolvedArtifactResult] objects to a List of
+                 * [ComponentArtifactIdentifier] objects.
+                 *
+                 * This follows the guidance from
+                 * https://docs.gradle.org/7.5/userguide/more_about_tasks.html.
+                 */
+                artifacts.map { result -> result.map { it.id } }
+            )
             task.destinationFile.set(getMetadataRegularFile(project))
         }
 
@@ -698,42 +714,3 @@
 private val hiddenPackagesJava = setOf(
     "androidx.*compose.*"
 )
-
-/**
- * Converts AndroidX library and path data to a list of [MetadataEntry].
- *
- * TODO(b/239095864) replace static data with dynamically generated data from libraries
- */
-private fun gatherMetadataEntries(): List<MetadataEntry> {
-    val pagingCompose = MetadataEntry(
-        groupId = "androidx.paging",
-        artifactId = "paging-compose",
-        releaseNotesUrl = "https://developer.android.com/jetpack/androidx/releases/paging",
-        sourceDir = "paging/compose"
-    )
-    val pagingRuntime = MetadataEntry(
-        groupId = "androidx.paging",
-        artifactId = "paging-runtime",
-        releaseNotesUrl = "https://developer.android.com/jetpack/androidx/releases/paging",
-        sourceDir = "paging"
-    )
-    val pagingRxJava2 = MetadataEntry(
-        groupId = "androidx.paging",
-        artifactId = "paging-rxjava2",
-        releaseNotesUrl = "https://developer.android.com/jetpack/androidx/releases/paging",
-        sourceDir = "paging/rxjava2"
-    )
-    val pagingRxJava3 = MetadataEntry(
-        groupId = "androidx.paging",
-        artifactId = "paging-rxjava3",
-        releaseNotesUrl = "https://developer.android.com/jetpack/androidx/releases/paging",
-        sourceDir = "paging/rxjava3"
-    )
-
-    return listOf(
-        pagingCompose,
-        pagingRuntime,
-        pagingRxJava2,
-        pagingRxJava3,
-    )
-}
\ No newline at end of file
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt b/buildSrc/private/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
index 879e9bb..3a0271c 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
@@ -22,7 +22,6 @@
 import androidx.build.checkapi.ApiBaselinesLocation
 import androidx.build.checkapi.ApiLocation
 import androidx.build.checkapi.getRequiredCompatibilityApiLocation
-import androidx.build.dependencyTracker.AffectedModuleDetector
 import androidx.build.java.JavaCompileInputs
 import androidx.build.uptodatedness.cacheEvenIfNoOutputs
 import com.android.build.gradle.tasks.ProcessLibraryManifest
@@ -60,7 +59,6 @@
                 task.manifestPath.set(processManifest.manifestOutputFile)
             }
             applyInputs(javaCompileInputs, task)
-            AffectedModuleDetector.configureTaskGuard(task)
             // If we will be updating the api lint baselines, then we should do that before
             // using it to validate the generated api
             task.mustRunAfter("updateApiLintBaseline")
@@ -84,7 +82,6 @@
                 task.bootClasspath = javaCompileInputs.bootClasspath
                 task.cacheEvenIfNoOutputs()
                 task.dependsOn(generateApi)
-                AffectedModuleDetector.configureTaskGuard(task)
             }
 
             ignoreApiChanges = project.tasks.register(
@@ -129,7 +126,6 @@
                 checkApiRelease?.let {
                     task.dependsOn(checkApiRelease)
                 }
-                AffectedModuleDetector.configureTaskGuard(task)
             }
 
         val regenerateOldApis = project.tasks.register(
@@ -163,7 +159,6 @@
             // developer updates an API, if backwards compatibility checks are enabled in the
             // library, then we want to check that the changes are backwards compatible.
             checkApiRelease?.let { task.dependsOn(it) }
-            AffectedModuleDetector.configureTaskGuard(task)
         }
 
         // ignoreApiChanges depends on the output of this task for the "current" API surface.
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt b/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
index 1e9dffa..3e7187d 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
@@ -21,7 +21,6 @@
 import androidx.build.addToCheckTask
 import androidx.build.checkapi.ApiLocation
 import androidx.build.checkapi.getRequiredCompatibilityApiLocation
-import androidx.build.dependencyTracker.AffectedModuleDetector
 import androidx.build.metalava.UpdateApiTask
 import androidx.build.uptodatedness.cacheEvenIfNoOutputs
 import org.gradle.api.Project
@@ -39,7 +38,6 @@
         builtApiLocation: ApiLocation,
         outputApiLocations: List<ApiLocation>
     ) {
-        @OptIn(ExperimentalStdlibApi::class)
         val packageResTask = project.tasks
             .named(
                 "package${variantName.replaceFirstChar {
@@ -62,7 +60,6 @@
             task.description = "Generates resource API files from source"
             task.builtApi.set(builtApiFile)
             task.apiLocation.set(builtApiLocation)
-            AffectedModuleDetector.configureTaskGuard(task)
         }
 
         // Policy: If the artifact has previously been released, e.g. has a beta or later API file
@@ -79,7 +76,6 @@
                 // Since apiLocation isn't a File, we have to manually set up the dependency.
                 task.dependsOn(generateResourceApi)
                 task.cacheEvenIfNoOutputs()
-                AffectedModuleDetector.configureTaskGuard(task)
             }
         }
 
@@ -101,7 +97,6 @@
             checkResourceApiRelease?.let {
                 task.dependsOn(it)
             }
-            AffectedModuleDetector.configureTaskGuard(task)
         }
 
         val updateResourceApi = project.tasks.register(
@@ -123,7 +118,6 @@
                 // compatible
                 task.dependsOn(it)
             }
-            AffectedModuleDetector.configureTaskGuard(task)
         }
 
         // Ensure that this task runs as part of "updateApi" task from MetalavaTasks.
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
index f092b49..0f41232 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
@@ -46,11 +46,6 @@
  * the [CameraGraph] interface.
  */
 public class CameraPipe(config: Config) {
-
-    @Deprecated("threadConfig should be specified on config.")
-    @Suppress("UNUSED_PARAMETER")
-    public constructor(config: Config, threadConfig: ThreadConfig) : this(config)
-
     private val debugId = cameraPipeIds.incrementAndGet()
     private val component: CameraPipeComponent = DaggerCameraPipeComponent.builder()
         .cameraPipeConfigModule(CameraPipeConfigModule(config))
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 b90b050..1025eb6 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
@@ -80,8 +80,6 @@
         /**
          * Adds a {@link CameraEffect} with its targets.
          *
-         * TODO: finish Javadoc once {@link ImageEffect} is supported.
-         *
          * @param targets      on which the effect will be applied. CameraX only supports
          *                     {@link SurfaceEffect#PREVIEW} for now.
          * @param cameraEffect the effect implementation.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
index 993d90e..ed49790 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
@@ -20,6 +20,8 @@
 import static androidx.camera.core.ImageProcessingUtil.applyPixelShiftForYUV;
 import static androidx.camera.core.ImageProcessingUtil.convertYUVToRGB;
 import static androidx.camera.core.ImageProcessingUtil.rotateYUV;
+import static androidx.camera.core.impl.utils.TransformUtils.NORMALIZED_RECT;
+import static androidx.camera.core.impl.utils.TransformUtils.getNormalizedToBuffer;
 
 import android.graphics.Matrix;
 import android.graphics.Rect;
@@ -55,7 +57,6 @@
 abstract class ImageAnalysisAbstractAnalyzer implements ImageReaderProxy.OnImageAvailableListener {
 
     private static final String TAG = "ImageAnalysisAnalyzer";
-    private static final RectF NORMALIZED_RECT = new RectF(-1, -1, 1, 1);
 
     // Member variables from ImageAnalysis.
     @GuardedBy("mAnalyzerLock")
@@ -490,11 +491,4 @@
         }
         return matrix;
     }
-
-    @NonNull
-    private static Matrix getNormalizedToBuffer(@NonNull RectF buffer) {
-        Matrix normalizedToBuffer = new Matrix();
-        normalizedToBuffer.setRectToRect(NORMALIZED_RECT, buffer, Matrix.ScaleToFit.FILL);
-        return normalizedToBuffer;
-    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceEffect.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceEffect.java
index 2f663178..5367124 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceEffect.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceEffect.java
@@ -21,16 +21,15 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
+import androidx.core.util.Consumer;
 
 /**
- * Interface for injecting a {@link Surface}-based post-processing effect into CameraX.
+ * Interface to implement a GPU-based post-processing effect.
  *
- * <p> TODO(b/233280438): update JavaDoc before going for API review.
- *
- * <p>Currently, this is only used by internal implementations such as "video cropping" and
- * "video recording during front/back camera switch". The interfaces themselves are also
- * placeholders and subject to change depending on API/design review. Moving forward, these
- * interfaces will be made public to developers and move to "androidx.camera.core".
+ * <p>This interface is for implementing a GPU effect for the {@link Preview} and/or
+ * {@code VideoCapture} {@link UseCase}. Both the input and the output of the implementation
+ * are {@link Surface}s. It's recommended to use graphics API such as OpenGL or Vulkan to access
+ * the {@link Surface}.
  *
  * @hide
  */
@@ -48,25 +47,38 @@
     int VIDEO_CAPTURE = 1 << 1;
 
     /**
-     * Invoked when the upstream pipeline requires a {@link Surface} to write to.
+     * Invoked when CameraX requires an input {@link Surface} for reading original frames.
      *
-     * <p> The implementation is expected t o create a {@link Surface} backed
-     * by{@link SurfaceTexture}, then listen for the
-     * {@link SurfaceTexture#setOnFrameAvailableListener} to get the incoming upstream frames.
+     * <p>With OpenGL, the implementation should create a {@link Surface} backed by
+     * {@link SurfaceTexture} with the size of {@link SurfaceRequest#getResolution()}, then
+     * listen for the {@link SurfaceTexture#setOnFrameAvailableListener} to get the incoming
+     * frames.
+     *
+     * <p>The value of the {@link SurfaceTexture#getTransformMatrix} will need an additional
+     * transformation. CameraX calculates the additional transformation based on {@link UseCase}
+     * configurations such as {@link ViewPort} and target rotation, and provide the value via
+     * {@link SurfaceOutput#updateTransformMatrix(float[], float[])}.
      *
      * @param request a request to provide {@link Surface} for input.
+     * @see SurfaceRequest
      */
     void onInputSurface(@NonNull SurfaceRequest request);
 
     /**
-     * Invoked when the downstream pipeline provide Surface(s) to be written to.
+     * Invoked when CameraX provides output Surface(s) for drawing processed frames.
      *
-     * <p> The implementation is expected to draw processed frames to the {@link Surface}
-     * acquired via {@link SurfaceOutput#getSurface} following specification defined in the said
-     * {@link SurfaceOutput}.
+     * <p>The provided {@link Surface}s are for drawing processed frames. The implementation must
+     * get the {@link Surface} via {@link SurfaceOutput#getSurface} and provide a
+     * {@link Consumer<SurfaceOutput.Event>} listening to the end-of-life event of the
+     * {@link Surface}. Then, the implementation should call {@link SurfaceOutput#close()} after it
+     * stops drawing to the {@link Surface}.
      *
-     * @param surfaceOutput a list of {@link SurfaceOutput}. For non stream sharing cases, the list
-     *                      will only contain one element.
+     * <p> When drawing to the {@link Surface}, the implementation should apply an additional
+     * transformation to the input {@link Surface} by calling
+     * {@link SurfaceOutput#updateTransformMatrix(float[], float[])} with the value of
+     * {@link SurfaceTexture#getTransformMatrix(float[])}} from the input {@link Surface}.
+     *
+     * @param surfaceOutput contains a {@link Surface} for drawing processed frames.
      */
     void onOutputSurface(@NonNull SurfaceOutput surfaceOutput);
 }
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 35753e0..4424d82 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
@@ -20,19 +20,22 @@
 import android.util.Size;
 import android.view.Surface;
 
+import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
+import androidx.core.util.Consumer;
 
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.auto.value.AutoValue;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.concurrent.Executor;
 
 /**
- * A completable, single-use {@link Surface} for outputting processed camera frames.
+ * A {@link Surface} for drawing processed camera frames.
  *
- * <p>Contains a {@link ListenableFuture<Surface>} and its characteristics along with methods
- * for notifying the end of life of the {@link Surface} and marking the {@link Surface} as no
- * longer in use.
+ * <p>Contains a {@link Surface} and its characteristics along with methods to manage the
+ * lifecycle of the {@link Surface}.
  *
  * @hide
  * @see SurfaceEffect#onOutputSurface(SurfaceOutput)
@@ -41,21 +44,20 @@
 public interface SurfaceOutput {
 
     /**
-     * Gets the output {@link Surface} for writing processed frames.
+     * Gets the {@link Surface} for drawing processed frames.
      *
-     * <p> If there are multiple calls to the method, only the {@link OnCloseRequestedListener}
+     * <p> If there are multiple calls to the method, only the {@link Consumer<Event>}
      * from the last call will be triggered.
      *
      * @param executor on which the listener should be invoked.
      * @param listener a listener to notify the implementation about the end-of-life of the
      *                 {@link SurfaceOutput}. The implementation should then invoke
      *                 {@link #close()} to mark the {@link Surface} as no longer in use.
-     * @see OnCloseRequestedListener
      */
     @NonNull
     Surface getSurface(
             @NonNull Executor executor,
-            @NonNull OnCloseRequestedListener listener);
+            @NonNull Consumer<Event> listener);
 
     /**
      * This field indicates that what purpose the {@link Surface} will be used for.
@@ -83,10 +85,10 @@
     int getFormat();
 
     /**
-     * Call this method to mark the {@link Surface} provided via {@link #getSurface} as no longer in
-     * use.
+     * Call this method to mark the {@link Surface} as no longer in use.
      *
-     * <p>After this is called, the implementation should stop writing to the {@link Surface}.
+     * <p>After this is called, the implementation should stop writing to the {@link Surface}
+     * provided via {@link #getSurface}
      */
     void close();
 
@@ -98,12 +100,13 @@
      * {@link SurfaceTexture#getTransformMatrix}. The result is matrix of the same format, which
      * is a transform matrix maps 2D homogeneous texture coordinates of the form (s, t, 0, 1)
      * with s and t in the inclusive range [0, 1] to the texture coordinate that should be used
-     * to sample that location from the texture. The result should be used in the same way as
-     * the original matrix. Please see the Javadoc of {@link SurfaceTexture#getTransformMatrix}.
+     * to sample that location from the texture. The matrix is stored in column-major order so that
+     * it may be passed directly to OpenGL ES via the {@code glLoadMatrixf} or {@code
+     * glUniformMatrix4fv} functions.
      *
      * <p>The additional transformation is calculated based on the target rotation, target
-     * resolution and the {@link ViewPort} configured by the app. The value could also include
-     * workaround for device specific quirks.
+     * resolution and the {@link ViewPort} associated with the target {@link UseCase}. The value
+     * could also include workarounds for device specific quirks.
      *
      * @param updated  the array into which the 4x4 matrix will be stored. The array must
      *                 have exactly 16 elements.
@@ -115,15 +118,58 @@
     void updateTransformMatrix(@NonNull float[] updated, @NonNull float[] original);
 
     /**
-     * A listener to notify the implementation about the end-of-life of the {@link Surface}.
+     * Events of the {@link Surface} retrieved from
+     * {@link SurfaceOutput#getSurface(Executor, Consumer)}.
      */
-    interface OnCloseRequestedListener {
+    @AutoValue
+    abstract class Event {
 
         /**
-         * After this is invoked, the implementation should finish the current access to the
-         * {@link Surface}, stop writing to the {@link Surface} and mark the
-         * {@link SurfaceOutput} as closed by calling {@link SurfaceOutput#close()}.
+         * Possible event codes.
+         *
+         * @hide
          */
-        void onCloseRequested();
+        @IntDef({EVENT_REQUEST_CLOSE})
+        @Retention(RetentionPolicy.SOURCE)
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        public @interface EventCode {
+        }
+
+        /**
+         * The {@link Surface} provider is requesting to release the {@link Surface}.
+         *
+         * <p> Releasing a {@link Surface} while it's still being written into is not safe on
+         * some devices. This is why the provider of the {@link Surface} will not release the
+         * {@link Surface} without the CameraX's permission. Once this event is received, the
+         * implementation should stop accessing the {@link Surface} as soon as possible, then
+         * mark the {@link SurfaceOutput} as closed by calling {@link SurfaceOutput#close()}.
+         * Once closed, CameraX will notify the {@link Surface} provider that it's safe to
+         * release the {@link Surface}.
+         */
+        public static final int EVENT_REQUEST_CLOSE = 0;
+
+        /**
+         * Returns the event associated with the {@link SurfaceOutput}.
+         */
+        @EventCode
+        public abstract int getEventCode();
+
+        /**
+         * Gets the {@link SurfaceOutput} associated with this event.
+         */
+        @NonNull
+        public abstract SurfaceOutput getSurfaceOutput();
+
+        /**
+         * Creates a {@link Event} for sending to the implementation.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+        @NonNull
+        public static SurfaceOutput.Event of(@EventCode int code,
+                @NonNull SurfaceOutput surfaceOutput) {
+            return new AutoValue_SurfaceOutput_Event(code, surfaceOutput);
+        }
     }
 }
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 76e9eab..44c76b4 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
@@ -107,7 +107,10 @@
         }
 
         /**
-         * Sets the {@link CameraEffect} used by the {@link UseCase}s.
+         * Sets the {@link EffectBundle} for the {@link UseCase}s.
+         *
+         * <p>Once set, CameraX will use the {@link SurfaceEffect}s to process the outputs of
+         * the {@link UseCase}s.
          *
          * @hide
          */
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/TransformUtils.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/TransformUtils.java
similarity index 92%
rename from camera/camera-view/src/main/java/androidx/camera/view/TransformUtils.java
rename to camera/camera-core/src/main/java/androidx/camera/core/impl/utils/TransformUtils.java
index 1552825..60dc5d5 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/TransformUtils.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/TransformUtils.java
@@ -14,18 +14,16 @@
  * limitations under the License.
  */
 
-package androidx.camera.view;
+package androidx.camera.core.impl.utils;
 
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.media.ExifInterface;
 import android.util.Size;
-import android.view.Surface;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-import androidx.annotation.RestrictTo;
 
 /**
  * Utility class for transform.
@@ -36,11 +34,8 @@
  * (clockwise v.s. counter-clockwise).
  *
  * TODO(b/179827713): merge this with {@link androidx.camera.core.internal.utils.ImageUtil}.
- *
- * @hide
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class TransformUtils {
 
     // Normalized space (-1, -1) - (1, 1).
@@ -85,24 +80,6 @@
     }
 
     /**
-     * Converts {@link Surface} rotation to rotation degrees: 90, 180, 270 or 0.
-     */
-    public static int surfaceRotationToRotationDegrees(int rotationValue) {
-        switch (rotationValue) {
-            case Surface.ROTATION_0:
-                return 0;
-            case Surface.ROTATION_90:
-                return 90;
-            case Surface.ROTATION_180:
-                return 180;
-            case Surface.ROTATION_270:
-                return 270;
-            default:
-                throw new IllegalStateException("Unexpected rotation value " + rotationValue);
-        }
-    }
-
-    /**
      * Returns true if the rotation degrees is 90 or 270.
      */
     public static boolean is90or270(int rotationDegrees) {
@@ -138,7 +115,8 @@
      *
      * <p> One example of the usage is comparing the viewport-based crop rect from different use
      * cases. The crop rect is rounded because pixels are integers, which may introduce an error
-     * when we check if the aspect ratio matches. For example, when {@link PreviewView}'s
+     * when we check if the aspect ratio matches. For example, when
+     * {@linkplain androidx.camera.view.PreviewView}'s
      * width/height are prime numbers 601x797, the crop rect from other use cases cannot have a
      * matching aspect ratio even if they are based on the same viewport. This method checks the
      * aspect ratio while tolerating a rounding error.
@@ -216,7 +194,7 @@
      * Gets the transform from a normalized space (-1, -1) - (1, 1) to the given rect.
      */
     @NonNull
-    private static Matrix getNormalizedToBuffer(@NonNull RectF viewPortRect) {
+    public static Matrix getNormalizedToBuffer(@NonNull RectF viewPortRect) {
         Matrix normalizedToBuffer = new Matrix();
         normalizedToBuffer.setRectToRect(NORMALIZED_RECT, viewPortRect, Matrix.ScaleToFit.FILL);
         return normalizedToBuffer;
@@ -280,6 +258,7 @@
         }
 
         // Map the normalized space back to the bitmap coordinates.
+        @SuppressWarnings("SuspiciousNameCombination")
         RectF restoredRect = isWidthHeightSwapped ? new RectF(0, 0, height, width) : rect;
         Matrix restore = new Matrix();
         restore.setRectToRect(NORMALIZED_RECT, restoredRect, Matrix.ScaleToFit.FILL);
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/DefaultSurfaceEffect.java
index c66cd10..7087c9d 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/DefaultSurfaceEffect.java
@@ -120,7 +120,7 @@
             return;
         }
         mGlExecutor.execute(() ->
-                mOutputSurfaces.put(surfaceOutput, surfaceOutput.getSurface(mGlExecutor, () -> {
+                mOutputSurfaces.put(surfaceOutput, surfaceOutput.getSurface(mGlExecutor, event -> {
                     surfaceOutput.close();
                     mOutputSurfaces.remove(surfaceOutput);
                 }))
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 a8a91fa..594fc22 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
@@ -30,11 +30,13 @@
 import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.util.Consumer;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicReference;
 
 
 /**
@@ -59,7 +61,7 @@
 
     @GuardedBy("mLock")
     @Nullable
-    private OnCloseRequestedListener mOnCloseRequestedListener;
+    private Consumer<Event> mEventListener;
     @GuardedBy("mLock")
     @Nullable
     private Executor mExecutor;
@@ -99,11 +101,11 @@
     @Override
     @NonNull
     public Surface getSurface(@NonNull Executor executor,
-            @NonNull OnCloseRequestedListener listener) {
+            @NonNull Consumer<Event> listener) {
         boolean hasPendingCloseRequest;
         synchronized (mLock) {
             mExecutor = executor;
-            mOnCloseRequestedListener = listener;
+            mEventListener = listener;
             hasPendingCloseRequest = mHasPendingCloseRequest;
         }
         if (hasPendingCloseRequest) {
@@ -116,22 +118,23 @@
      * Asks the {@link SurfaceEffect} implementation to stopping writing to the {@link Surface}.
      */
     public void requestClose() {
-        OnCloseRequestedListener onCloseRequestedListener = null;
+        AtomicReference<Consumer<Event>> eventListenerRef = new AtomicReference<>();
         Executor executor = null;
         synchronized (mLock) {
-            if (mExecutor == null || mOnCloseRequestedListener == null) {
+            if (mExecutor == null || mEventListener == null) {
                 // If close is requested but not executed because of missing listener, set a flag so
                 // we can execute it when the listener is et.
                 mHasPendingCloseRequest = true;
             } else if (!mIsClosed) {
-                onCloseRequestedListener = mOnCloseRequestedListener;
+                eventListenerRef.set(mEventListener);
                 executor = mExecutor;
                 mHasPendingCloseRequest = false;
             }
         }
         if (executor != null) {
             try {
-                executor.execute(onCloseRequestedListener::onCloseRequested);
+                executor.execute(() -> eventListenerRef.get().accept(
+                        Event.of(Event.EVENT_REQUEST_CLOSE, SurfaceOutputImpl.this)));
             } catch (RejectedExecutionException e) {
                 // The executor might be invoked after the SurfaceOutputImpl is closed. This
                 // happens if the #close() is called after the synchronized block above but
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/TransformUtilsTest.java b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/TransformUtilsTest.java
similarity index 78%
rename from camera/camera-view/src/test/java/androidx/camera/view/TransformUtilsTest.java
rename to camera/camera-core/src/test/java/androidx/camera/core/impl/utils/TransformUtilsTest.java
index 73c8820..2808ba3 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/TransformUtilsTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/TransformUtilsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 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.
@@ -14,17 +14,19 @@
  * limitations under the License.
  */
 
-package androidx.camera.view;
+package androidx.camera.core.impl.utils;
 
-import static androidx.camera.view.TransformUtils.getExifTransform;
-import static androidx.camera.view.TransformUtils.rectToVertices;
+import static androidx.camera.core.impl.utils.TransformUtils.getExifTransform;
+import static androidx.camera.core.impl.utils.TransformUtils.rectToVertices;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import android.graphics.Matrix;
+import android.graphics.Rect;
 import android.graphics.RectF;
 import android.media.ExifInterface;
 import android.os.Build;
+import android.util.Size;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,6 +46,21 @@
     private static final int HEIGHT = 300;
 
     @Test
+    public void viewPortMatchAllowRoundingError() {
+        // Arrange: create two 1:1 crop rect. Due to rounding error, one is 11:9 and another is
+        // 9:11.
+        Rect cropRect1 = new Rect();
+        new RectF(0.4999f, 0.5f, 10.5f, 10.4999f).round(cropRect1);
+        Rect cropRect2 = new Rect();
+        new RectF(0.5f, 0.4999f, 10.4999f, 10.5f).round(cropRect2);
+
+        // Assert: they are within rounding error.
+        assertThat(TransformUtils.isAspectRatioMatchingWithRoundingError(
+                new Size(cropRect1.width(), cropRect1.height()), false,
+                new Size(cropRect2.width(), cropRect2.height()), false)).isTrue();
+    }
+
+    @Test
     public void exifOrientation_flipHorizontal() {
         verifyExifOrientation(ExifInterface.ORIENTATION_FLIP_HORIZONTAL, new float[]{
                 WIDTH, 0, 0, 0, 0, HEIGHT, WIDTH, HEIGHT
diff --git a/camera/camera-extensions/lint-baseline.xml b/camera/camera-extensions/lint-baseline.xml
deleted file mode 100644
index a9df457..0000000
--- a/camera/camera-extensions/lint-baseline.xml
+++ /dev/null
@@ -1,4 +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">
-
-</issues>
diff --git a/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java b/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java
index 3ae7d6b..52b5f08 100644
--- a/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java
+++ b/camera/camera-mlkit-vision/src/main/java/androidx/camera/mlkit/vision/MlKitAnalyzer.java
@@ -40,12 +40,14 @@
 import androidx.camera.view.transform.OutputTransform;
 import androidx.core.util.Consumer;
 
+import com.google.android.gms.tasks.Task;
 import com.google.mlkit.vision.interfaces.Detector;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CancellationException;
 import java.util.concurrent.Executor;
 
 /**
@@ -207,12 +209,31 @@
         }
         Detector<?> detector = mDetectors.get(detectorIndex);
         int rotationDegrees = imageProxy.getImageInfo().getRotationDegrees();
-        detector.process(image, rotationDegrees, transform).addOnCompleteListener(
+
+        Task<?> mlKitTask;
+        try {
+            mlKitTask = detector.process(image, rotationDegrees, transform);
+        } catch (Exception e) {
+            // If the detector is closed, it will throw a MlKitException.UNAVAILABLE. It's not
+            // public in the "mlkit:vision-interfaces" artifact so we have to catch a generic
+            // Exception here.
+            throwables.put(detector, new RuntimeException("Failed to process the image.", e));
+            // This detector is closed, but the next one might still be open. Send the image to
+            // the next detector.
+            detectRecursively(imageProxy, detectorIndex + 1, transform, values,
+                    throwables);
+            return;
+        }
+        mlKitTask.addOnCompleteListener(
                 mExecutor,
                 task -> {
                     // Record the return value / exception.
-                    values.put(detector, task.getResult());
-                    if (task.getException() != null) {
+                    if (task.isCanceled()) {
+                        throwables.put(detector,
+                                new CancellationException("The task is canceled."));
+                    } else if (task.isSuccessful()) {
+                        values.put(detector, task.getResult());
+                    } else {
                         throwables.put(detector, task.getException());
                     }
                     // Go to the next detector.
@@ -337,7 +358,8 @@
         }
 
         private void checkDetectorExists(@NonNull Detector<?> detector) {
-            checkArgument(mValues.containsKey(detector), "The detector does not exist");
+            checkArgument(mValues.containsKey(detector) || mThrowables.containsKey(detector),
+                    "The detector does not exist");
         }
     }
 }
diff --git a/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeDetector.kt b/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeDetector.kt
index 28778e5..b7a38c1 100644
--- a/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeDetector.kt
+++ b/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeDetector.kt
@@ -19,6 +19,7 @@
 import android.graphics.Bitmap
 import android.graphics.Matrix
 import android.media.Image
+import androidx.annotation.VisibleForTesting
 import com.google.android.gms.tasks.Task
 import com.google.mlkit.vision.interfaces.Detector
 import java.nio.ByteBuffer
@@ -28,17 +29,25 @@
  */
 class FakeDetector(
     private val result: String?,
-    private val exception: Exception?,
-    private val detectorType: Int
+    private val detectorType: Int,
 ) : Detector<String> {
 
+    @VisibleForTesting
     var latestMatrix: Matrix? = null
+    @VisibleForTesting
     var latestRotationDegrees: Int = -1
 
+    private var closed = false
+    var taskException: Exception? = null
+    var taskCanceled: Boolean = false
+
     override fun process(image: Image, rotationDegrees: Int, matrix: Matrix): Task<String> {
+        if (closed) {
+            throw Exception("Closed")
+        }
         latestMatrix = matrix
         latestRotationDegrees = rotationDegrees
-        return FakeTask(result, exception)
+        return FakeTask(result, taskException, taskCanceled)
     }
 
     override fun getDetectorType(): Int {
@@ -46,7 +55,7 @@
     }
 
     override fun close() {
-        TODO("Not yet implemented")
+        closed = true
     }
 
     override fun process(p0: Bitmap, p1: Int): Task<String> {
diff --git a/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeTask.kt b/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeTask.kt
index 8af2521..2eda9cf 100644
--- a/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeTask.kt
+++ b/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/FakeTask.kt
@@ -21,6 +21,7 @@
 import com.google.android.gms.tasks.OnFailureListener
 import com.google.android.gms.tasks.OnSuccessListener
 import com.google.android.gms.tasks.Task
+import java.util.concurrent.CancellationException
 import java.util.concurrent.Executor
 
 /**
@@ -28,22 +29,26 @@
  */
 class FakeTask<T>(
     private val result: T?,
-    private val exception: Exception?
+    private val exception: Exception? = null,
+    private val canceled: Boolean = false
 ) : Task<T>() {
 
     override fun isComplete(): Boolean {
-        TODO("Not yet implemented")
+        return true
     }
 
     override fun isSuccessful(): Boolean {
-        TODO("Not yet implemented")
+        return result != null && !canceled && exception == null
     }
 
     override fun isCanceled(): Boolean {
-        TODO("Not yet implemented")
+        return canceled
     }
 
     override fun getResult(): T? {
+        if (canceled) {
+            throw CancellationException()
+        }
         return result
     }
 
diff --git a/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/MlKitAnalyzerTest.kt b/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/MlKitAnalyzerTest.kt
index 23cd954..c4dcc0f 100644
--- a/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/MlKitAnalyzerTest.kt
+++ b/camera/camera-mlkit-vision/src/test/java/androidx/camera/mlkit/vision/MlKitAnalyzerTest.kt
@@ -31,6 +31,7 @@
 import com.google.mlkit.vision.interfaces.Detector
 import com.google.mlkit.vision.interfaces.Detector.TYPE_BARCODE_SCANNING
 import com.google.mlkit.vision.interfaces.Detector.TYPE_FACE_DETECTION
+import kotlin.coroutines.cancellation.CancellationException
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.mockito.Mockito.mock
@@ -54,9 +55,50 @@
     }
 
     @Test
+    fun detectorIsClosed_returnsException() {
+        // Arrange: create 2 detectors, one is closed and one is open.
+        val closedDetector = FakeDetector(RETURN_VALUE, TYPE_BARCODE_SCANNING)
+        closedDetector.close()
+        val openDetector = FakeDetector(RETURN_VALUE, TYPE_BARCODE_SCANNING)
+        var result: MlKitAnalyzer.Result? = null
+        val mlKitAnalyzer = MlKitAnalyzer(
+            listOf(closedDetector, openDetector),
+            ImageAnalysis.COORDINATE_SYSTEM_ORIGINAL,
+            directExecutor()
+        ) {
+            result = it
+        }
+        // Act.
+        mlKitAnalyzer.analyze(createFakeImageProxy())
+        // Assert: the closed detector contains a Exception. The open one contains the value.
+        assertThat(result!!.getThrowable(closedDetector)).isInstanceOf(Exception::class.java)
+        assertThat(result!!.getValue(openDetector)).isEqualTo(RETURN_VALUE)
+    }
+
+    @Test
+    fun taskIsCanceled_returnsCancellationException() {
+        // Arrange: create a detector that delivers canceled tasks.
+        val fakeDetector = FakeDetector(RETURN_VALUE, TYPE_BARCODE_SCANNING)
+        fakeDetector.taskCanceled = true
+        var result: MlKitAnalyzer.Result? = null
+        val mlKitAnalyzer = MlKitAnalyzer(
+            listOf(fakeDetector),
+            ImageAnalysis.COORDINATE_SYSTEM_ORIGINAL,
+            directExecutor()
+        ) {
+            result = it
+        }
+        // Act.
+        mlKitAnalyzer.analyze(createFakeImageProxy())
+        // Assert: the result has a CancellationException.
+        assertThat(result!!.getThrowable(fakeDetector))
+            .isInstanceOf(CancellationException::class.java)
+    }
+
+    @Test
     fun createAnalyzerWith2Detectors_overridesWithHigherResolution() {
-        val barcodeScanner = FakeDetector(RETURN_VALUE, null, TYPE_BARCODE_SCANNING)
-        val faceDetector = FakeDetector(RETURN_VALUE, null, TYPE_FACE_DETECTION)
+        val barcodeScanner = FakeDetector(RETURN_VALUE, TYPE_BARCODE_SCANNING)
+        val faceDetector = FakeDetector(RETURN_VALUE, TYPE_FACE_DETECTION)
         val mlKitAnalyzer = MlKitAnalyzer(
             listOf(barcodeScanner, faceDetector),
             ImageAnalysis.COORDINATE_SYSTEM_ORIGINAL,
@@ -69,8 +111,9 @@
     @Test
     fun analyze_detectorsReceiveValues() {
         // Arrange: 2 detectors, one succeeds and one fails.
-        val failDetector = FakeDetector(null, Exception(), TYPE_BARCODE_SCANNING)
-        val successDetector = FakeDetector(RETURN_VALUE, null, TYPE_BARCODE_SCANNING)
+        val failDetector = FakeDetector(null, TYPE_BARCODE_SCANNING)
+        failDetector.taskException = Exception()
+        val successDetector = FakeDetector(RETURN_VALUE, TYPE_BARCODE_SCANNING)
         var result: MlKitAnalyzer.Result? = null
         val mlKitAnalyzer = MlKitAnalyzer(
             listOf(failDetector, successDetector),
@@ -98,7 +141,7 @@
     @Test(expected = IllegalArgumentException::class)
     fun segmentationAndPreviewView_throwsException() {
         MlKitAnalyzer(
-            listOf(FakeDetector(RETURN_VALUE, null, Detector.TYPE_SEGMENTATION)),
+            listOf(FakeDetector(RETURN_VALUE, Detector.TYPE_SEGMENTATION)),
             COORDINATE_SYSTEM_VIEW_REFERENCED,
             directExecutor()
         ) {}
@@ -109,7 +152,7 @@
         // Arrange.
         val additionalTransform = Matrix()
         additionalTransform.setScale(2F, 2F)
-        val detector = FakeDetector(RETURN_VALUE, null, TYPE_BARCODE_SCANNING)
+        val detector = FakeDetector(RETURN_VALUE, TYPE_BARCODE_SCANNING)
         val analyzer = MlKitAnalyzer(
             listOf(detector),
             COORDINATE_SYSTEM_VIEW_REFERENCED,
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
index 44aba00..089ee92 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
@@ -24,6 +24,8 @@
 import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.Intent;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
 import android.os.Build;
 import android.os.RemoteException;
 import android.util.Log;
@@ -84,6 +86,38 @@
     }
 
     /**
+     * Throws the Exception for devices whose front camera is not testable.
+     *
+     * Vivo 1805 will popup dialog to ask permission for accessing its front camera and then break
+     * the test. This function is used for switching camera tests that the tests should be
+     * skipped no matter the tests are started from the back or front camera.
+     */
+    public static void assumeCanTestFrontCamera() throws CameraAccessException {
+        if ("vivo 1805".equals(Build.MODEL)) {
+            throw new AssumptionViolatedException("Vivo 1805 will popup dialog to ask permission "
+                    + "to access the front camera.");
+        }
+    }
+
+    /**
+     * Throws the Exception for devices which the specified camera id is front camera and is not
+     * testable.
+     *
+     * Vivo 1805 will popup dialog to ask permission for accessing its front camera and then break
+     * the test.
+     */
+    public static void assumeNotUntestableFrontCamera(@NonNull String cameraId)
+            throws CameraAccessException {
+        CameraCharacteristics characteristics =
+                CameraUtil.getCameraManager().getCameraCharacteristics(cameraId);
+        if ("vivo 1805".equals(Build.MODEL) && characteristics.get(
+                CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT) {
+            throw new AssumptionViolatedException("Vivo 1805 will popup dialog to ask permission "
+                    + "to access the front camera.");
+        }
+    }
+
+    /**
      * Clean up the device UI and back to the home screen for test.
      * @param instrumentation the instrumentation used to run the test
      */
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/FakeSurfaceEffect.java
index 7465175..8a3d05d 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/FakeSurfaceEffect.java
@@ -88,7 +88,7 @@
     public void onOutputSurface(@NonNull SurfaceOutput surfaceOutput) {
         mSurfaceOutput = surfaceOutput;
         mOutputSurface = surfaceOutput.getSurface(mExecutor,
-                () -> {
+                output -> {
                     if (mAutoCloseSurfaceOutput) {
                         surfaceOutput.close();
                     }
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt
index aa0d932..59cc6c5 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/SupportedQualitiesVerificationTest.kt
@@ -35,9 +35,11 @@
 import android.content.Context
 import android.os.Build
 import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraInfo
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraUtil
@@ -66,11 +68,13 @@
     private val lensFacing: Int,
     private var cameraSelector: CameraSelector,
     private var quality: Quality,
+    private val cameraConfig: CameraXConfig,
+    private val implName: String,
 ) {
 
     @get:Rule
     val cameraRule = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraConfig)
     )
 
     companion object {
@@ -91,11 +95,28 @@
         )
 
         @JvmStatic
-        @Parameterized.Parameters(name = "lensFacing={0}, quality={2}")
+        @Parameterized.Parameters(name = "lensFacing={0}, quality={2}, config={4}")
         fun data() = mutableListOf<Array<Any?>>().apply {
             cameraSelectors.forEach { cameraSelector ->
                 quality.forEach { quality ->
-                    add(arrayOf(cameraSelector.lensFacing, cameraSelector, quality))
+                    add(
+                        arrayOf(
+                            cameraSelector.lensFacing,
+                            cameraSelector,
+                            quality,
+                            Camera2Config.defaultConfig(),
+                            Camera2Config::class.simpleName
+                        )
+                    )
+                    add(
+                        arrayOf(
+                            cameraSelector.lensFacing,
+                            cameraSelector,
+                            quality,
+                            CameraPipeConfig.defaultConfig(),
+                            CameraPipeConfig::class.simpleName
+                        )
+                    )
                 }
             }
         }
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 0adceba..00bf998 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
@@ -208,10 +208,21 @@
      *
      * @hide
      */
+    @SuppressWarnings("unchecked")
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Override
     public void onStateAttached() {
         super.onStateAttached();
+        Preconditions.checkNotNull(getAttachedSurfaceResolution(), "The suggested resolution "
+                + "should be already updated and shouldn't be null.");
+        Preconditions.checkState(mSurfaceRequest == null, "The surface request should be null "
+                + "when VideoCapture is attached.");
+        mSessionConfigBuilder = createPipeline(getCameraId(),
+                (VideoCaptureConfig<T>) getCurrentConfig(), getAttachedSurfaceResolution());
+        applyStreamInfoToSessionConfigBuilder(mSessionConfigBuilder, mStreamInfo);
+        updateSessionConfig(mSessionConfigBuilder.build());
+        // VideoCapture has to be active to apply SessionConfig's template type.
+        notifyActive();
         getOutput().getStreamInfo().addObserver(CameraXExecutors.mainThreadExecutor(),
                 mStreamInfoObserver);
         setSourceState(VideoOutput.SourceState.ACTIVE_NON_STREAMING);
@@ -228,7 +239,6 @@
     @NonNull
     protected Size onSuggestedResolutionUpdated(@NonNull Size suggestedResolution) {
         Logger.d(TAG, "suggestedResolution = " + suggestedResolution);
-        String cameraId = getCameraId();
         VideoCaptureConfig<T> config = (VideoCaptureConfig<T>) getCurrentConfig();
 
         // SuggestedResolution gives the upper bound of allowed resolution size.
@@ -259,14 +269,6 @@
             }
         }
 
-        mStreamInfo = fetchObservableValue(getOutput().getStreamInfo(),
-                StreamInfo.STREAM_INFO_ANY_INACTIVE);
-        mSessionConfigBuilder = createPipeline(cameraId, config, finalSelectedResolution);
-        applyStreamInfoToSessionConfigBuilder(mSessionConfigBuilder, mStreamInfo);
-        updateSessionConfig(mSessionConfigBuilder.build());
-        // VideoCapture has to be active to apply SessionConfig's template type.
-        notifyActive();
-
         return finalSelectedResolution;
     }
 
@@ -290,17 +292,6 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Override
-    public void onDetached() {
-        clearPipeline();
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Override
     public void onStateDetached() {
         Preconditions.checkState(Threads.isMainThread(), "VideoCapture can only be detached on "
                 + "the main thread.");
@@ -312,6 +303,9 @@
                         + "cancelled.");
             }
         }
+        // Clear the pipeline to close the surface, which releases the codec so that it's
+        // available for other applications.
+        clearPipeline();
     }
 
     @NonNull
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 1bd92a0..0f0e34c 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
@@ -53,6 +53,7 @@
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import java.util.concurrent.TimeUnit
 import org.junit.After
 import org.junit.Assert.assertThrows
 import org.junit.Test
@@ -63,7 +64,6 @@
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
-import java.util.concurrent.TimeUnit
 
 private val ANY_SIZE = Size(640, 480)
 private const val CAMERA_ID_0 = "0"
@@ -330,6 +330,40 @@
     }
 
     @Test
+    fun detachUseCases_receiveResultOfSurfaceRequest() {
+        // Arrange.
+        setupCamera()
+        cameraUseCaseAdapter =
+            CameraUtil.createCameraUseCaseAdapter(context, CameraSelector.DEFAULT_BACK_CAMERA)
+
+        var surfaceResult: SurfaceRequest.Result? = null
+        val videoOutput = createVideoOutput { surfaceRequest ->
+            surfaceRequest.provideSurface(
+                mock(Surface::class.java),
+                CameraXExecutors.directExecutor()
+            ) { surfaceResult = it }
+        }
+        val videoCapture = VideoCapture.Builder(videoOutput)
+            .setSessionOptionUnpacker { _, _ -> }
+            .build()
+
+        // Act.
+        cameraUseCaseAdapter.addUseCases(listOf(videoCapture))
+
+        // Assert.
+        // Surface is in use, should not receive any result.
+        assertThat(surfaceResult).isNull()
+
+        // Act.
+        cameraUseCaseAdapter.detachUseCases()
+
+        // Assert.
+        assertThat(surfaceResult!!.resultCode).isEqualTo(
+            SurfaceRequest.Result.RESULT_SURFACE_USED_SUCCESSFULLY
+        )
+    }
+
+    @Test
     fun setTargetRotation_rotationIsChanged() {
         // Arrange.
         val videoCapture = VideoCapture.withOutput(createVideoOutput())
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/TransformUtilsDeviceTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/TransformUtilsDeviceTest.java
deleted file mode 100644
index 6c226c8..0000000
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/TransformUtilsDeviceTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.camera.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.util.Size;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Instrument test for {@link TransformUtils}
- */
-@LargeTest
-@RunWith(AndroidJUnit4.class)
-@SdkSuppress(minSdkVersion = 21)
-public class TransformUtilsDeviceTest {
-
-    @Test
-    public void viewPortMatchAllowRoundingError() {
-        // Arrange: create two 1:1 crop rect. Due to rounding error, one is 11:9 and another is
-        // 9:11.
-        Rect cropRect1 = new Rect();
-        new RectF(0.4999f, 0.5f, 10.5f, 10.4999f).round(cropRect1);
-        Rect cropRect2 = new Rect();
-        new RectF(0.5f, 0.4999f, 10.4999f, 10.5f).round(cropRect2);
-
-        // Assert: they are within rounding error.
-        assertThat(TransformUtils.isAspectRatioMatchingWithRoundingError(
-                new Size(cropRect1.width(), cropRect1.height()), false,
-                new Size(cropRect2.width(), cropRect2.height()), false)).isTrue();
-    }
-}
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java
index 800bbc2..4049e5c 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java
@@ -21,14 +21,14 @@
 import static android.graphics.Paint.FILTER_BITMAP_FLAG;
 
 import static androidx.camera.core.impl.ImageOutputConfig.ROTATION_NOT_SPECIFIED;
+import static androidx.camera.core.impl.utils.CameraOrientationUtil.surfaceRotationToDegrees;
+import static androidx.camera.core.impl.utils.TransformUtils.getRectToRect;
+import static androidx.camera.core.impl.utils.TransformUtils.is90or270;
+import static androidx.camera.core.impl.utils.TransformUtils.isAspectRatioMatchingWithRoundingError;
 import static androidx.camera.view.PreviewView.ScaleType.FILL_CENTER;
 import static androidx.camera.view.PreviewView.ScaleType.FIT_CENTER;
 import static androidx.camera.view.PreviewView.ScaleType.FIT_END;
 import static androidx.camera.view.PreviewView.ScaleType.FIT_START;
-import static androidx.camera.view.TransformUtils.getRectToRect;
-import static androidx.camera.view.TransformUtils.is90or270;
-import static androidx.camera.view.TransformUtils.isAspectRatioMatchingWithRoundingError;
-import static androidx.camera.view.TransformUtils.surfaceRotationToRotationDegrees;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -154,7 +154,7 @@
     Matrix getTextureViewCorrectionMatrix() {
         Preconditions.checkState(isTransformationInfoReady());
         RectF surfaceRect = new RectF(0, 0, mResolution.getWidth(), mResolution.getHeight());
-        int rotationDegrees = -surfaceRotationToRotationDegrees(mTargetRotation);
+        int rotationDegrees = -surfaceRotationToDegrees(mTargetRotation);
         return getRectToRect(surfaceRect, surfaceRect, rotationDegrees);
     }
 
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 0d09ff3..a46b7cb 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
@@ -18,7 +18,7 @@
 
 import static androidx.camera.core.impl.ImageOutputConfig.ROTATION_NOT_SPECIFIED;
 import static androidx.camera.core.impl.utils.Threads.checkMainThread;
-import static androidx.camera.view.TransformUtils.getNormalizedToBuffer;
+import static androidx.camera.core.impl.utils.TransformUtils.getNormalizedToBuffer;
 import static androidx.core.content.ContextCompat.getMainExecutor;
 
 import android.annotation.SuppressLint;
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
index 0cb9663..9c441dc 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
@@ -16,7 +16,7 @@
 
 package androidx.camera.view.transform;
 
-import static androidx.camera.view.TransformUtils.isAspectRatioMatchingWithRoundingError;
+import static androidx.camera.core.impl.utils.TransformUtils.isAspectRatioMatchingWithRoundingError;
 
 import android.graphics.Matrix;
 import android.graphics.PointF;
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
index 2ddacc7..c7bda95 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
@@ -16,9 +16,9 @@
 
 package androidx.camera.view.transform;
 
-import static androidx.camera.view.TransformUtils.getExifTransform;
-import static androidx.camera.view.TransformUtils.getNormalizedToBuffer;
-import static androidx.camera.view.TransformUtils.rectToSize;
+import static androidx.camera.core.impl.utils.TransformUtils.getExifTransform;
+import static androidx.camera.core.impl.utils.TransformUtils.getNormalizedToBuffer;
+import static androidx.camera.core.impl.utils.TransformUtils.rectToSize;
 
 import android.content.ContentResolver;
 import android.graphics.Bitmap;
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
index 70fd950..b20c929 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
@@ -16,10 +16,10 @@
 
 package androidx.camera.view.transform;
 
-import static androidx.camera.view.TransformUtils.getNormalizedToBuffer;
-import static androidx.camera.view.TransformUtils.getRectToRect;
-import static androidx.camera.view.TransformUtils.is90or270;
-import static androidx.camera.view.TransformUtils.rectToSize;
+import static androidx.camera.core.impl.utils.TransformUtils.getNormalizedToBuffer;
+import static androidx.camera.core.impl.utils.TransformUtils.getRectToRect;
+import static androidx.camera.core.impl.utils.TransformUtils.is90or270;
+import static androidx.camera.core.impl.utils.TransformUtils.rectToSize;
 
 import android.graphics.Matrix;
 import android.graphics.RectF;
diff --git a/camera/camera-view/src/test/java/androidx/camera/view/PreviewTransformationTest.kt b/camera/camera-view/src/test/java/androidx/camera/view/PreviewTransformationTest.kt
index d62ac90..ddf2b9e 100644
--- a/camera/camera-view/src/test/java/androidx/camera/view/PreviewTransformationTest.kt
+++ b/camera/camera-view/src/test/java/androidx/camera/view/PreviewTransformationTest.kt
@@ -24,7 +24,7 @@
 import android.view.View
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.ImageOutputConfig.RotationValue
-import androidx.camera.view.TransformUtils.sizeToVertices
+import androidx.camera.core.impl.utils.TransformUtils.sizeToVertices
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
 import kotlin.math.roundToInt
diff --git a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt
index f68b2e5..16e57c2 100644
--- a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt
+++ b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt
@@ -78,7 +78,9 @@
 
     @After
     fun tearDown() {
-        mSurfaceRequest.viewfinderSurface.close()
+        if (::mSurfaceRequest.isInitialized) {
+            mSurfaceRequest.viewfinderSurface.close()
+        }
     }
 
     @Test
diff --git a/camera/integration-tests/camerapipetestapp/lint-baseline.xml b/camera/integration-tests/camerapipetestapp/lint-baseline.xml
index 642b238..9bb52d0 100644
--- a/camera/integration-tests/camerapipetestapp/lint-baseline.xml
+++ b/camera/integration-tests/camerapipetestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -10,13 +10,4 @@
             file="src/main/java/androidx/camera/integration/camera2/pipe/CameraPipeApplication.kt"/>
     </issue>
 
-    <issue
-        id="MissingTestSizeAnnotation"
-        message="Missing test size annotation"
-        errorLine1="    fun useAppContext() {"
-        errorLine2="        ~~~~~~~~~~~~~">
-        <location
-            file="src/androidTest/java/androidx/camera/integration/camera2/pipe/BasicInstrumentedTest.kt"/>
-    </issue>
-
 </issues>
diff --git a/camera/integration-tests/coretestapp/build.gradle b/camera/integration-tests/coretestapp/build.gradle
index 7fef5d8..3b85cb8 100644
--- a/camera/integration-tests/coretestapp/build.gradle
+++ b/camera/integration-tests/coretestapp/build.gradle
@@ -65,6 +65,7 @@
     implementation(project(":camera:camera-camera2-pipe-integration"))
     implementation(project(":camera:camera-core"))
     implementation(project(":camera:camera-lifecycle"))
+    implementation(project(":camera:camera-mlkit-vision"))
     implementation(project(":camera:camera-video"))
     // Needed because AGP enforces same version between main and androidTest classpaths
     implementation(project(":concurrent:concurrent-futures"))
diff --git a/camera/integration-tests/coretestapp/lint-baseline.xml b/camera/integration-tests/coretestapp/lint-baseline.xml
index bc6c935..4bde6a4 100644
--- a/camera/integration-tests/coretestapp/lint-baseline.xml
+++ b/camera/integration-tests/coretestapp/lint-baseline.xml
@@ -2,13 +2,6 @@
 <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="NotificationPermission"
-        message="When targeting Android 13 or higher, posting a permission requires holding the `POST_NOTIFICATIONS` permission (usage from leakcanary.NotificationEventListener)">
-        <location
-            file="$GRADLE_USER_HOME/caches/transforms-3/4366a02f2b10003dc48387e903833c2d/transformed/leakcanary-android-core-2.8.1/jars/classes.jar"/>
-    </issue>
-
-    <issue
         id="UnsafeOptInUsageError"
         message="This declaration is opt-in and its usage should be marked with&#xA;&apos;@androidx.camera.core.ExperimentalZeroShutterLag&apos; or &apos;@OptIn(markerClass = androidx.camera.core.ExperimentalZeroShutterLag.class)&apos;"
         errorLine1="            return ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG;"
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt
index cb47a1d..45f998f 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/CameraXActivityTestExtensions.kt
@@ -72,7 +72,16 @@
         Espresso.onView(ViewMatchers.withId(R.id.Picture)).perform(click())
     } finally { // Always release the idling resource, in case of timeout exceptions.
         IdlingRegistry.getInstance().unregister(idlingResource)
-        withActivity { deleteSessionImages() }
+        withActivity {
+            // Idling resource will also become idle when an error occurs. Checks the last error
+            // message and throw an Exception to make the test failed if the error message is not
+            // null.
+            if (lastTakePictureErrorMessage != null) {
+                throw Exception(lastTakePictureErrorMessage)
+            } else {
+                deleteSessionImages()
+            }
+        }
     }
 }
 
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt
index 9921e84..7f0e32e 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/MLKitBarcodeTest.kt
@@ -23,8 +23,9 @@
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.ImageAnalysis
-import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.core.impl.utils.executor.CameraXExecutors.ioExecutor
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.mlkit.vision.MlKitAnalyzer
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.LabTestRule
 import androidx.camera.testing.fakes.FakeLifecycleOwner
@@ -35,7 +36,6 @@
 import com.google.mlkit.vision.barcode.BarcodeScannerOptions
 import com.google.mlkit.vision.barcode.BarcodeScanning
 import com.google.mlkit.vision.barcode.common.Barcode.FORMAT_QR_CODE
-import com.google.mlkit.vision.common.InputImage
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 import kotlinx.coroutines.Dispatchers
@@ -68,16 +68,18 @@
     val labTest: LabTestRule = LabTestRule()
 
     companion object {
-        private const val DETECT_TIMEOUT = 5_000L
+        private const val DETECT_TIMEOUT = 10_000L
         private const val TAG = "MLKitVisionTest"
         private val size480p = Size(640, 480)
         private val size720p = Size(1280, 720)
+
         @JvmStatic
         @Parameterized.Parameters
         fun data() = listOf(size480p, size720p)
     }
 
     private val context: Context = ApplicationProvider.getApplicationContext()
+
     // For MK Kit Barcode scanner
     private lateinit var barcodeScanner: BarcodeScanner
     private var imageResolution: Size = resolution
@@ -146,36 +148,19 @@
 
     private fun assertBarcodeDetect(imageAnalysis: ImageAnalysis) {
         val latchForBarcodeDetect = CountDownLatch(2)
-
-        imageAnalysis.setAnalyzer(
-            CameraXExecutors.ioExecutor()
-        ) { imageProxy ->
-            imageResolution = Size(imageProxy.image!!.width, imageProxy.image!!.height)
-            imageRotation = imageProxy.imageInfo.rotationDegrees
-            barcodeScanner.process(
-                InputImage.fromMediaImage(
-                    imageProxy.image!!,
-                    imageProxy.imageInfo.rotationDegrees
-                )
-            )
-                .addOnSuccessListener { barcodes ->
-                    barcodes.forEach {
-                        if ("Hi, CamX!" == it.displayValue) {
-                            latchForBarcodeDetect.countDown()
-                        }
-                        Log.d(TAG, "barcode display value: {${it.displayValue}} ")
-                    }
+        val mlKitAnalyzer = MlKitAnalyzer(
+            listOf(barcodeScanner),
+            ImageAnalysis.COORDINATE_SYSTEM_ORIGINAL,
+            ioExecutor()
+        ) { result ->
+            result.getValue(barcodeScanner)?.forEach {
+                if ("Hi, CamX!" == it.displayValue) {
+                    latchForBarcodeDetect.countDown()
                 }
-                .addOnFailureListener { exception ->
-                    Log.e(TAG, "processImage onFailure: $exception")
-                }
-                // When the image is from CameraX analysis use case, must call image.close() on
-                // received images when finished using them. Otherwise, new images may not be
-                // received or the camera may stall.
-                .addOnCompleteListener {
-                    imageProxy.close()
-                }
+                Log.d(TAG, "barcode display value: {${it.displayValue}} ")
+            }
         }
+        imageAnalysis.setAnalyzer(ioExecutor(), mlKitAnalyzer)
 
         // Verify it is the CameraX lab test environment and can detect qr-code.
         assertWithMessage(
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
index 6192486..befb664 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
@@ -78,10 +78,6 @@
     @get:Rule
     val repeatRule = RepeatRule()
 
-    private val context = ApplicationProvider.getApplicationContext<Context>()
-
-    private lateinit var cameraProvider: ProcessCameraProvider
-
     companion object {
         @ClassRule
         @JvmField
@@ -97,6 +93,7 @@
     fun setup(): Unit = runBlocking {
         Assume.assumeTrue(CameraUtil.deviceHasCamera())
         CoreAppTestUtil.assumeCompatibleDevice()
+        CoreAppTestUtil.assumeNotUntestableFrontCamera(cameraId)
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
@@ -105,24 +102,21 @@
         // mDevice.unfreezeRotation() in the tearDown() method. Any simulated rotations will be
         // explicitly initiated from within the test.
         device.setOrientationNatural()
-
-        cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
     }
 
     @After
     fun tearDown(): Unit = runBlocking {
-        if (::cameraProvider.isInitialized) {
-            withContext(Dispatchers.Main) {
-                cameraProvider.unbindAll()
-                cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
-            }
-        }
-
         // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
         // to other tests :)
         device.unfreezeRotation()
         device.pressHome()
         device.waitForIdle(StressTestUtil.HOME_TIMEOUT_MS)
+
+        withContext(Dispatchers.Main) {
+            val context = ApplicationProvider.getApplicationContext<Context>()
+            val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
+            cameraProvider.shutdown()[10, TimeUnit.SECONDS]
+        }
     }
 
     @LabTestRule.LabTestOnly
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
index 60f9bd1..cfc9c26 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
@@ -99,6 +99,7 @@
     fun setup(): Unit = runBlocking {
         assumeTrue(CameraUtil.deviceHasCamera())
         CoreAppTestUtil.assumeCompatibleDevice()
+        CoreAppTestUtil.assumeNotUntestableFrontCamera(cameraId)
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
@@ -121,7 +122,6 @@
     fun tearDown(): Unit = runBlocking {
         if (::cameraProvider.isInitialized) {
             withContext(Dispatchers.Main) {
-                cameraProvider.unbindAll()
                 cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
             }
         }
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
index 7d414bd..bbb9455 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
@@ -102,6 +102,7 @@
     fun setup(): Unit = runBlocking {
         Assume.assumeTrue(CameraUtil.deviceHasCamera())
         CoreAppTestUtil.assumeCompatibleDevice()
+        CoreAppTestUtil.assumeCanTestFrontCamera()
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
@@ -124,7 +125,6 @@
     fun tearDown(): Unit = runBlocking {
         if (::cameraProvider.isInitialized) {
             withContext(Dispatchers.Main) {
-                cameraProvider.unbindAll()
                 cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
             }
         }
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 f35f604..6b988a0 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
@@ -16,6 +16,11 @@
 
 package androidx.camera.integration.core;
 
+import static androidx.camera.core.ImageCapture.ERROR_CAMERA_CLOSED;
+import static androidx.camera.core.ImageCapture.ERROR_CAPTURE_FAILED;
+import static androidx.camera.core.ImageCapture.ERROR_FILE_IO;
+import static androidx.camera.core.ImageCapture.ERROR_INVALID_CAMERA;
+import static androidx.camera.core.ImageCapture.ERROR_UNKNOWN;
 import static androidx.camera.core.ImageCapture.FLASH_MODE_AUTO;
 import static androidx.camera.core.ImageCapture.FLASH_MODE_OFF;
 import static androidx.camera.core.ImageCapture.FLASH_MODE_ON;
@@ -316,6 +321,13 @@
             new CountingIdlingResource("videosaved");
 
     /**
+     * Saves the error message of the last take picture action if any error occurs. This will be
+     * null which means no error occurs.
+     */
+    @Nullable
+    private String mLastTakePictureErrorMessage = null;
+
+    /**
      * Retrieve idling resource that waits for image received by analyzer).
      */
     @VisibleForTesting
@@ -702,6 +714,7 @@
                     @Override
                     public void onClick(View view) {
                         mImageSavedIdlingResource.increment();
+                        mLastTakePictureErrorMessage = null;
 
                         mStartCaptureTime = SystemClock.elapsedRealtime();
                         createDefaultPictureFolderIfNotExist();
@@ -743,12 +756,47 @@
                                     @Override
                                     public void onError(@NonNull ImageCaptureException exception) {
                                         Log.e(TAG, "Failed to save image.", exception.getCause());
+
+                                        mLastTakePictureErrorMessage =
+                                                getImageCaptureErrorMessage(exception);
+                                        if (!mImageSavedIdlingResource.isIdleNow()) {
+                                            mImageSavedIdlingResource.decrement();
+                                        }
                                     }
                                 });
                     }
                 });
     }
 
+    private String getImageCaptureErrorMessage(@NonNull ImageCaptureException exception) {
+        String errorCodeString;
+        int errorCode = exception.getImageCaptureError();
+
+        switch (errorCode) {
+            case ERROR_UNKNOWN:
+                errorCodeString = "ImageCaptureErrorCode: ERROR_UNKNOWN";
+                break;
+            case ERROR_FILE_IO:
+                errorCodeString = "ImageCaptureErrorCode: ERROR_FILE_IO";
+                break;
+            case ERROR_CAPTURE_FAILED:
+                errorCodeString = "ImageCaptureErrorCode: ERROR_CAPTURE_FAILED";
+                break;
+            case ERROR_CAMERA_CLOSED:
+                errorCodeString = "ImageCaptureErrorCode: ERROR_CAMERA_CLOSED";
+                break;
+            case ERROR_INVALID_CAMERA:
+                errorCodeString = "ImageCaptureErrorCode: ERROR_INVALID_CAMERA";
+                break;
+            default:
+                errorCodeString = "ImageCaptureErrorCode: " + errorCode;
+                break;
+        }
+
+        return errorCodeString + ", Message: " + exception.getMessage() + ", Cause: "
+                + exception.getCause();
+    }
+
     @SuppressWarnings("ObjectToString")
     private void setUpCameraDirectionButton() {
         mCameraDirectionButton.setOnClickListener(v -> {
@@ -1681,6 +1729,16 @@
         return findUseCase(ImageCapture.class);
     }
 
+    /**
+     * Returns the error message of the last take picture action if any error occurs. Returns
+     * null if no error occurs.
+     */
+    @VisibleForTesting
+    @Nullable
+    String getLastTakePictureErrorMessage() {
+        return mLastTakePictureErrorMessage;
+    }
+
     @SuppressWarnings("unchecked")
     VideoCapture<Recorder> getVideoCapture() {
         return findUseCase(VideoCapture.class);
diff --git a/camera/integration-tests/timingtestapp/lint-baseline.xml b/camera/integration-tests/timingtestapp/lint-baseline.xml
index 4986493..41a139d7 100644
--- a/camera/integration-tests/timingtestapp/lint-baseline.xml
+++ b/camera/integration-tests/timingtestapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/camera/integration-tests/uiwidgetstestapp/build.gradle b/camera/integration-tests/uiwidgetstestapp/build.gradle
index 9c8eef1..2631c7c 100644
--- a/camera/integration-tests/uiwidgetstestapp/build.gradle
+++ b/camera/integration-tests/uiwidgetstestapp/build.gradle
@@ -68,6 +68,8 @@
     implementation(project(":camera:camera-lifecycle"))
     implementation(project(":camera:camera-view"))
     implementation(project(":camera:camera-video"))
+    implementation(project(":camera:camera-mlkit-vision"))
+    implementation 'com.google.mlkit:barcode-scanning:17.0.2'
 
     // Android Support Library
     implementation("androidx.appcompat:appcompat:1.2.0")
@@ -88,6 +90,7 @@
     implementation 'androidx.activity:activity-compose:1.4.0'
     implementation 'androidx.compose.material:material:1.1.1'
     implementation 'androidx.compose.animation:animation:1.1.1'
+    implementation 'androidx.compose.runtime:runtime:1.1.1'
     implementation 'androidx.compose.ui:ui-tooling:1.1.1'
     implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1'
     implementation 'androidx.navigation:navigation-compose:2.4.2'
diff --git a/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml b/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
deleted file mode 100644
index d3d401e..0000000
--- a/camera/integration-tests/uiwidgetstestapp/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `getMDisplayManager` of class `OrientationConfigChangesOverriddenActivity` requires synthetic accessor"
-        errorLine1="                val display = mDisplayManager.getDisplay(displayId)"
-        errorLine2="                              ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/camera/integration/uiwidgets/rotations/OrientationConfigChangesOverriddenActivity.kt"/>
-    </issue>
-
-</issues>
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml b/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml
index 10f572a..7c65a18 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml
@@ -63,7 +63,8 @@
         <activity
             android:exported="false"
             android:name=".compose.ComposeCameraActivity"
-            android:label="Compose"/>
+            android:label="Compose"
+            android:screenOrientation="portrait"/>
     </application>
 
     <uses-feature android:name="android.hardware.camera.any" />
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreen.kt b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreen.kt
index 914a04e..4cf4fe8 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreen.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreen.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.uiwidgets.compose.ui.screen.imagecapture
 
+import android.graphics.Rect
 import android.view.ViewGroup
 import androidx.camera.core.MeteringPoint
 import androidx.camera.core.Preview.SurfaceProvider
@@ -23,6 +24,8 @@
 import androidx.camera.integration.uiwidgets.compose.ui.screen.components.CameraControlButtonPlaceholder
 import androidx.camera.integration.uiwidgets.compose.ui.screen.components.CameraControlRow
 import androidx.camera.view.PreviewView
+import androidx.camera.view.transform.OutputTransform
+import androidx.compose.foundation.Canvas
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.layout.Arrangement
@@ -39,18 +42,27 @@
 import androidx.compose.material.icons.sharp.FlipCameraAndroid
 import androidx.compose.material.icons.sharp.Lens
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.remember
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.drawscope.Stroke
 import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalLifecycleOwner
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.viewinterop.AndroidView
 
+// ImageCaptureScreen with QR-Code Overlay (Supports Preview + ImageCapture + ImageAnalysis)
+// Screen provides ImageCapture functionality and draws a bounding box around a detected QR Code
+// This is to ensure that the combination of use cases can be well supported in Compose
+// It uses OutputTransform hence we need to @SuppressWarnings to get past the linter
+@SuppressWarnings("UnsafeOptInUsageError")
 @Composable
 fun ImageCaptureScreen(
     modifier: Modifier = Modifier,
@@ -63,6 +75,13 @@
         state.startCamera(context = localContext, lifecycleOwner = lifecycleOwner)
     }
 
+    // Release resources when the Composable is removed from the Composition
+    DisposableEffect(Unit) {
+        onDispose {
+            state.releaseResources()
+        }
+    }
+
     ImageCaptureScreen(
         modifier = modifier,
         zoomRatio = state.zoomRatio,
@@ -77,10 +96,16 @@
             state.takePhoto(localContext)
         },
         onSurfaceProviderReady = state::setSurfaceProvider,
+        onOutputTransformReady = state::setOutputTransform,
         onTouch = state::startTapToFocus
-    )
+    ) {
+        // Uses overlay to draw detected QRCode in the image stream
+        QRCodeOverlay(qrCodeBoundingBox = state.qrCodeBoundingBox)
+    }
 }
 
+// It uses OutputTransform hence we need to @SuppressWarnings to get past the linter
+@SuppressWarnings("UnsafeOptInUsageError")
 @Composable
 fun ImageCaptureScreen(
     modifier: Modifier,
@@ -94,7 +119,9 @@
     onFlipCameraIconClicked: () -> Unit,
     onImageCaptureIconClicked: () -> Unit,
     onSurfaceProviderReady: (SurfaceProvider) -> Unit,
-    onTouch: (MeteringPoint) -> Unit
+    onOutputTransformReady: (OutputTransform) -> Unit,
+    onTouch: (MeteringPoint) -> Unit,
+    content: @Composable () -> Unit = {} // overlay to display something above PreviewView
 ) {
     val localContext = LocalContext.current
 
@@ -109,6 +136,9 @@
                 ViewGroup.LayoutParams.MATCH_PARENT
             )
 
+            // Uses TextureView. Required by MLKitAnalyzer to acquire the correct OutputTransform
+            implementationMode = PreviewView.ImplementationMode.COMPATIBLE
+
             onSurfaceProviderReady(this.surfaceProvider)
 
             setOnTouchListener { view, motionEvent ->
@@ -121,11 +151,21 @@
         }
     }
 
+    // Provides OutputTransform when PreviewView is attached on the screen
+    LaunchedEffect(key1 = previewView.outputTransform) {
+        if (previewView.outputTransform != null) {
+            onOutputTransformReady(previewView.outputTransform!!)
+        }
+    }
+
     Box(modifier = modifier.fillMaxSize()) {
         AndroidView(
             factory = { previewView }
         )
 
+        // Overlay over PreviewView in ImageCaptureScreen
+        content()
+
         Column(
             modifier = Modifier.align(Alignment.BottomCenter),
             verticalArrangement = Arrangement.Bottom
@@ -184,4 +224,28 @@
             }
         }
     }
+}
+
+@Composable
+fun QRCodeOverlay(qrCodeBoundingBox: Rect?) {
+
+    // Draw Bounding Box around QR Code if detected
+    Canvas(modifier = Modifier.fillMaxSize()) {
+        if (qrCodeBoundingBox != null) {
+            drawRect(
+                color = Color.Red,
+                topLeft = Offset(
+                    qrCodeBoundingBox.left.toFloat(),
+                    qrCodeBoundingBox.top.toFloat()
+                ),
+                size = Size(
+                    qrCodeBoundingBox.width().toFloat(),
+                    qrCodeBoundingBox.height().toFloat()
+                ),
+                style = Stroke(
+                    width = 5.0f
+                )
+            )
+        }
+    }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreenState.kt b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreenState.kt
index ee8bd3c..4f77685 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreenState.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/compose/ui/screen/imagecapture/ImageCaptureScreenState.kt
@@ -18,6 +18,7 @@
 
 import android.content.ContentValues
 import android.content.Context
+import android.graphics.Rect
 import android.os.Build
 import android.provider.MediaStore
 import android.util.Log
@@ -26,12 +27,17 @@
 import androidx.camera.core.CameraControl.OperationCanceledException
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.FocusMeteringAction
+import androidx.camera.core.ImageAnalysis
+import androidx.camera.core.ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageCaptureException
 import androidx.camera.core.MeteringPoint
 import androidx.camera.core.Preview
 import androidx.camera.core.Preview.SurfaceProvider
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.mlkit.vision.MlKitAnalyzer
+import androidx.camera.view.CameraController.COORDINATE_SYSTEM_VIEW_REFERENCED
+import androidx.camera.view.transform.OutputTransform
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.sharp.FlashAuto
 import androidx.compose.material.icons.sharp.FlashOff
@@ -47,14 +53,22 @@
 import androidx.concurrent.futures.await
 import androidx.core.content.ContextCompat
 import androidx.lifecycle.LifecycleOwner
+import com.google.mlkit.vision.barcode.BarcodeScannerOptions
+import com.google.mlkit.vision.barcode.BarcodeScanning
+import com.google.mlkit.vision.barcode.common.Barcode
 import java.text.SimpleDateFormat
 import java.util.Locale
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.asExecutor
 import kotlinx.coroutines.launch
 
 private const val DEFAULT_LENS_FACING = CameraSelector.LENS_FACING_FRONT
 private const val DEFAULT_FLASH_MODE = ImageCapture.FLASH_MODE_OFF
 
+// State Holder for ImageCaptureScreen
+// This State Holder supports Preview + ImageCapture + ImageAnalysis Use Cases
+// It provides the states and implementations used in the ImageCaptureScreen
 class ImageCaptureScreenState(
     initialLensFacing: Int = DEFAULT_LENS_FACING,
     initialFlashMode: Int = DEFAULT_FLASH_MODE
@@ -81,11 +95,48 @@
     var zoomRatio by mutableStateOf(1f)
         private set
 
+    var qrCodeBoundingBox by mutableStateOf<Rect?>(null)
+        private set
+
+    // Configure QR Code Scanner
+    private val barcodeScanner = BarcodeScanning.getClient(
+        BarcodeScannerOptions.Builder()
+            .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
+            .build()
+    )
+
+    // Uses COORDINATE_SYSTEM_VIEW_REFERENCED to transform bounding box
+    // to PreviewView's coordinates
+    // We need to acquire OutputTransform from PreviewView for this to work
+    private val mlKitAnalyzer = MlKitAnalyzer(
+        listOf(barcodeScanner),
+        COORDINATE_SYSTEM_VIEW_REFERENCED,
+        Dispatchers.Main.asExecutor()
+    ) { result ->
+        val barcodes = result.getValue(barcodeScanner)
+        qrCodeBoundingBox = if (barcodes != null && barcodes.size > 0) {
+            barcodes[0].boundingBox
+        } else {
+            null
+        }
+    }
+
+    // Use Cases
     private val preview = Preview.Builder().build()
     private val imageCapture = ImageCapture
         .Builder()
         .setFlashMode(flashMode)
         .build()
+    private val imageAnalysis = ImageAnalysis
+        .Builder()
+        .setBackpressureStrategy(STRATEGY_KEEP_ONLY_LATEST)
+        .build()
+        .also {
+            it.setAnalyzer(
+                Dispatchers.Main.asExecutor(),
+                mlKitAnalyzer
+            )
+        }
 
     private var camera: Camera? = null
 
@@ -96,6 +147,13 @@
         preview.setSurfaceProvider(surfaceProvider)
     }
 
+    // To update MlKitAnalyzer's OutputTransform when PreviewView is attached to Screen
+    // It uses OutputTransform hence we need to @SuppressWarnings to get past the linter
+    @SuppressWarnings("UnsafeOptInUsageError")
+    fun setOutputTransform(outputTransform: OutputTransform) {
+        mlKitAnalyzer.updateTransform(outputTransform.matrix)
+    }
+
     @JvmName("setLinearZoomFunction")
     fun setLinearZoom(linearZoom: Float) {
         Log.d(TAG, "Setting Linear Zoom $linearZoom")
@@ -178,7 +236,8 @@
                     lifecycleOwner,
                     cameraSelector,
                     preview,
-                    imageCapture
+                    imageCapture,
+                    imageAnalysis
                 )
 
                 // Setup components that require Camera
@@ -235,6 +294,11 @@
             .build()
     }
 
+    // Method to release resources when the Screen is removed from the Composition
+    fun releaseResources() {
+        barcodeScanner.close()
+    }
+
     private fun getValidInitialFlashMode(flashMode: Int): Int {
         return if (flashMode in VALID_FLASH_MODES) {
             flashMode
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MlKitFragment.kt b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MlKitFragment.kt
index e63d1e0..685a18e 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MlKitFragment.kt
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MlKitFragment.kt
@@ -21,6 +21,7 @@
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.Button
 import android.widget.ToggleButton
 import androidx.camera.core.CameraSelector.DEFAULT_BACK_CAMERA
 import androidx.camera.core.CameraSelector.DEFAULT_FRONT_CAMERA
@@ -30,6 +31,7 @@
 import androidx.camera.view.LifecycleCameraController
 import androidx.camera.view.PreviewView
 import androidx.fragment.app.Fragment
+import com.google.mlkit.vision.barcode.BarcodeScanner
 import com.google.mlkit.vision.barcode.BarcodeScanning
 
 /**
@@ -41,7 +43,7 @@
     private lateinit var previewView: PreviewView
     private lateinit var overlayView: OverlayView
     private lateinit var toggle: ToggleButton
-    private val barcodeScanner = BarcodeScanning.getClient()
+    private var barcodeScanner: BarcodeScanner? = null
 
     override fun onCreateView(
         inflater: LayoutInflater,
@@ -55,32 +57,48 @@
         toggle = view.findViewById(R.id.toggle_camera)
         toggle.setOnCheckedChangeListener { _, _ -> updateCameraOrientation() }
         previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
+        // This button resets the pipeline. This is for testing when the detector is closed,
+        // MlKitAnalyzer handles it correctly.
+        view.findViewById<Button>(R.id.restart).setOnClickListener { clearAndSetAnalyzer() }
 
         // Set up CameraX.
         cameraController = LifecycleCameraController(requireContext())
         cameraController.bindToLifecycle(viewLifecycleOwner)
         previewView.controller = cameraController
-
-        cameraController.setImageAnalysisAnalyzer(mainThreadExecutor(),
-            MlKitAnalyzer(
-                listOf(barcodeScanner),
-                COORDINATE_SYSTEM_VIEW_REFERENCED,
-                mainThreadExecutor()
-            ) { result ->
-                val barcodes = result.getValue(barcodeScanner)
-                if (barcodes != null && barcodes.size > 0) {
-                    overlayView.setTileRect(RectF(barcodes[0].boundingBox))
-                    overlayView.invalidate()
-                }
-            })
+        clearAndSetAnalyzer()
 
         // Update states to match UI.
         updateCameraOrientation()
         return view
     }
 
+    override fun onDestroyView() {
+        super.onDestroyView()
+        barcodeScanner?.close()
+    }
+
     private fun updateCameraOrientation() {
         cameraController.cameraSelector =
             if (toggle.isChecked) DEFAULT_BACK_CAMERA else DEFAULT_FRONT_CAMERA
     }
+
+    private fun clearAndSetAnalyzer() {
+        barcodeScanner?.close()
+        barcodeScanner = BarcodeScanning.getClient()
+
+        cameraController.clearImageAnalysisAnalyzer()
+        val scanner = barcodeScanner!!
+        cameraController.setImageAnalysisAnalyzer(mainThreadExecutor(),
+            MlKitAnalyzer(
+                listOf(scanner),
+                COORDINATE_SYSTEM_VIEW_REFERENCED,
+                mainThreadExecutor()
+            ) { result ->
+                val barcodes = result.getValue(scanner)
+                if (barcodes != null && barcodes.size > 0) {
+                    overlayView.setTileRect(RectF(barcodes[0].boundingBox))
+                    overlayView.invalidate()
+                }
+            })
+    }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/viewtestapp/src/main/res/layout-land/mlkit_view.xml b/camera/integration-tests/viewtestapp/src/main/res/layout-land/mlkit_view.xml
index da267fa..f6ec0b7 100644
--- a/camera/integration-tests/viewtestapp/src/main/res/layout-land/mlkit_view.xml
+++ b/camera/integration-tests/viewtestapp/src/main/res/layout-land/mlkit_view.xml
@@ -45,5 +45,10 @@
             android:textOff="@string/toggle_camera_front"
             android:textOn="@string/toggle_camera_back"
             android:checked="true"/>
+        <Button
+            android:id="@+id/restart"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/btn_restart"/>
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/camera/integration-tests/viewtestapp/src/main/res/layout/mlkit_view.xml b/camera/integration-tests/viewtestapp/src/main/res/layout/mlkit_view.xml
index bc30222..6ae1b91 100644
--- a/camera/integration-tests/viewtestapp/src/main/res/layout/mlkit_view.xml
+++ b/camera/integration-tests/viewtestapp/src/main/res/layout/mlkit_view.xml
@@ -42,5 +42,10 @@
             android:textOff="@string/toggle_camera_front"
             android:textOn="@string/toggle_camera_back"
             android:checked="true"/>
+        <Button
+            android:id="@+id/restart"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/btn_restart"/>
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml b/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
index 01ea7da..f4766fe 100644
--- a/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
+++ b/camera/integration-tests/viewtestapp/src/main/res/values/donottranslate-strings.xml
@@ -43,6 +43,7 @@
     <string name="btn_switch">Switch</string>
     <string name="btn_confirm">Confirm</string>
     <string name="btn_cancel">Cancel</string>
+    <string name="btn_restart">Restart</string>
     <string name="preview_view">Preview View</string>
     <string name="camera_controller">Camera Controller</string>
     <string name="transform">Transform</string>
diff --git a/car/app/app-samples/navigation/common/lint-baseline.xml b/car/app/app-samples/navigation/common/lint-baseline.xml
index 1dc0a34..f493425 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.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="ClassVerificationFailure"
diff --git a/car/app/app-samples/showcase/common/lint-baseline.xml b/car/app/app-samples/showcase/common/lint-baseline.xml
index 08c9828..6e655f8 100644
--- a/car/app/app-samples/showcase/common/lint-baseline.xml
+++ b/car/app/app-samples/showcase/common/lint-baseline.xml
@@ -2,13 +2,6 @@
 <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="NotificationPermission"
-        message="When targeting Android 13 or higher, posting a permission requires holding the `POST_NOTIFICATIONS` permission (usage from leakcanary.NotificationEventListener)">
-        <location
-            file="$GRADLE_USER_HOME/caches/transforms-3/4366a02f2b10003dc48387e903833c2d/transformed/leakcanary-android-core-2.8.1/jars/classes.jar"/>
-    </issue>
-
-    <issue
         id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.car.app.sample.showcase.common.navigation.NavigationNotificationsDemoScreen is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                                        context.startForegroundService(intent);"
diff --git a/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java b/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
index 732527c..a43ef8f 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/constraints/ActionsConstraints.java
@@ -136,6 +136,7 @@
                     .setMaxActions(2)
                     .addDisallowedActionType(Action.TYPE_APP_ICON)
                     .setRequireActionIcons(true)
+                    .setOnClickListenerAllowed(true)
                     .build();
 
     private final int mMaxActions;
diff --git a/car/app/app/src/main/java/androidx/car/app/model/constraints/RowListConstraints.java b/car/app/app/src/main/java/androidx/car/app/model/constraints/RowListConstraints.java
index 0314850..c95c851 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/constraints/RowListConstraints.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/constraints/RowListConstraints.java
@@ -67,14 +67,33 @@
                     .setRowConstraints(ROW_CONSTRAINTS_SIMPLE)
                     .build();
 
-    /** Default constraints for the route preview card. */
+    /**
+     * Default constraints for the route preview card.
+     *
+     * @deprecated This is deprecated. Use
+     * {@link #MAP_ROW_LIST_CONSTRAINTS_ALLOW_SELECTABLE} instead.
+     *
+     * As more half sheet template lists allow selectable lists, this constraints is
+     * too narrow for the only use case at route preview template. Use
+     * {@link #MAP_ROW_LIST_CONSTRAINTS_ALLOW_SELECTABLE} for more general half sheet lists.
+     */
     @NonNull
+    @Deprecated
     public static final RowListConstraints ROW_LIST_CONSTRAINTS_ROUTE_PREVIEW =
             new RowListConstraints.Builder(ROW_LIST_CONSTRAINTS_CONSERVATIVE)
                     .setRowConstraints(ROW_CONSTRAINTS_SIMPLE)
                     .setAllowSelectableLists(true)
                     .build();
 
+    /** Default constraints for half sheet template lists that allow selectable lists. */
+    @NonNull
+    public static final RowListConstraints MAP_ROW_LIST_CONSTRAINTS_ALLOW_SELECTABLE =
+            new RowListConstraints.Builder(ROW_LIST_CONSTRAINTS_CONSERVATIVE)
+                    .setRowConstraints(ROW_CONSTRAINTS_SIMPLE)
+                    .setAllowSelectableLists(true)
+                    .build();
+
+
     /** Default constraints for uniform lists of items, full width (simple + toggle support). */
     @NonNull
     public static final RowListConstraints ROW_LIST_CONSTRAINTS_FULL_LIST =
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java
index 4c17372..ddc02ca 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java
@@ -18,8 +18,8 @@
 
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_BODY_WITH_PRIMARY_ACTION;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_NAVIGATION;
+import static androidx.car.app.model.constraints.RowListConstraints.MAP_ROW_LIST_CONSTRAINTS_ALLOW_SELECTABLE;
 import static androidx.car.app.model.constraints.RowListConstraints.ROW_LIST_CONSTRAINTS_PANE;
-import static androidx.car.app.model.constraints.RowListConstraints.ROW_LIST_CONSTRAINTS_SIMPLE;
 
 import static java.util.Objects.requireNonNull;
 
@@ -278,7 +278,7 @@
         @NonNull
         public Builder setItemList(@NonNull ItemList itemList) {
             List<Item> items = requireNonNull(itemList).getItems();
-            ROW_LIST_CONSTRAINTS_SIMPLE.validateOrThrow(itemList);
+            MAP_ROW_LIST_CONSTRAINTS_ALLOW_SELECTABLE.validateOrThrow(itemList);
             ModelUtils.validateAllRowsHaveOnlySmallImages(items);
             ModelUtils.validateNoRowsHaveBothMarkersAndImages(items);
             mItemList = itemList;
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
index da95f6c..7559ca2 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
@@ -19,7 +19,7 @@
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_HEADER;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_MAP;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_NAVIGATION;
-import static androidx.car.app.model.constraints.RowListConstraints.ROW_LIST_CONSTRAINTS_ROUTE_PREVIEW;
+import static androidx.car.app.model.constraints.RowListConstraints.MAP_ROW_LIST_CONSTRAINTS_ALLOW_SELECTABLE;
 
 import static java.util.Objects.requireNonNull;
 
@@ -443,7 +443,8 @@
          */
         @NonNull
         public Builder setItemList(@NonNull ItemList itemList) {
-            ROW_LIST_CONSTRAINTS_ROUTE_PREVIEW.validateOrThrow(requireNonNull(itemList));
+            MAP_ROW_LIST_CONSTRAINTS_ALLOW_SELECTABLE
+                    .validateOrThrow(requireNonNull(itemList));
             ModelUtils.validateAllRowsHaveDistanceOrDuration(itemList.getItems());
             ModelUtils.validateAllRowsHaveOnlySmallImages(itemList.getItems());
 
diff --git a/car/app/app/src/test/java/androidx/car/app/navigation/model/MapTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/navigation/model/MapTemplateTest.java
index 927cdbf..8f6bbd5 100644
--- a/car/app/app/src/test/java/androidx/car/app/navigation/model/MapTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/navigation/model/MapTemplateTest.java
@@ -236,23 +236,6 @@
     }
 
     @Test
-    public void addList_selectable_throws() {
-        assertThrows(
-                IllegalArgumentException.class,
-                () ->
-                        new MapTemplate.Builder()
-                                .setHeader(DEFAULT_HEADER)
-                                .setItemList(TestUtils.createItemListWithDistanceSpan(6, true,
-                                        mDistanceSpan))
-                                .build());
-
-        new MapTemplate.Builder()
-                .setHeader(DEFAULT_HEADER)
-                .setItemList(TestUtils.createItemListWithDistanceSpan(6, false, mDistanceSpan))
-                .build();
-    }
-
-    @Test
     public void addList_moreThanMaxTexts_throws() {
         SpannableString title = new SpannableString("Title");
         title.setSpan(mDistanceSpan, /* start= */ 0, /* end= */ 1, /* flags= */ 0);
@@ -397,6 +380,33 @@
     }
 
     @Test
+    public void createInstanceWithSelectableItemList() {
+        ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
+        String title = "title";
+        Header header = new Header.Builder()
+                .setTitle(title)
+                .setStartHeaderAction(Action.BACK)
+                .build();
+        MapController mapController = new MapController.Builder()
+                .setMapActionStrip(mMapActionStrip)
+                .build();
+        ItemList itemList = TestUtils.createItemListWithDistanceSpan(6, true, mDistanceSpan);
+        MapTemplate template = new MapTemplate.Builder()
+                .setMapController(mapController)
+                .setItemList(itemList)
+                .setHeader(header)
+                .setActionStrip(actionStrip)
+                .build();
+
+        assertThat(template.getMapController()).isEqualTo(mapController);
+        assertThat(template.getItemList()).isEqualTo(itemList);
+        assertThat(template.getItemList().getSelectedIndex()).isEqualTo(0);
+        assertThat(template.getPane()).isNull();
+        assertThat(template.getHeader()).isEqualTo(header);
+        assertThat(template.getActionStrip()).isEqualTo(actionStrip);
+    }
+
+    @Test
     public void createInstanceWithItemListAndPane_throwsIllegalStateException() {
         ActionStrip actionStrip = new ActionStrip.Builder().addAction(Action.BACK).build();
         String title = "title";
diff --git a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt
index ce267e4..f18c818 100644
--- a/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt
+++ b/compose/animation/animation-core-lint/src/test/java/androidx/compose/animation/core/lint/UnrememberedAnimatableDetectorTest.kt
@@ -40,64 +40,6 @@
     override fun getIssues(): MutableList<Issue> =
         mutableListOf(UnrememberedAnimatableDetector.UnrememberedAnimatable)
 
-    // Simplified Animatable.kt stubs
-    private val AnimatableStub = compiledStub(
-        filename = "Animatable.kt",
-        filepath = "androidx/compose/animation/core",
-        checksum = 0xfbab86fa,
-        """
-            package androidx.compose.animation.core
-
-            class Animatable<T, V>(
-                initialValue: T,
-                val typeConverter: V? = null
-            )
-
-            fun Animatable(initialValue: Float): Animatable<Float, Any> = Animatable(initialValue)
-        """,
-"""
-        META-INF/main.kotlin_module:
-        H4sIAAAAAAAAAHWLuwrCQBBFR6IIo9UWIiIIKRQs1sYfEMt0CraySYY4sI+w
-        D/DzXVGrYHG5cDgHAAoAGOVNvg94xJWyrXfcPmXjTO8CSWXZqMjOisWVbafp
-        pnSi049WEQ+4+V9l4knMP76qNeVgi8tB4JONbEjghQyZmnz2drgeeIll51X/
-        4CaI6dlp9xZnOI4UoijuVSxhDy8wojKE3QAAAA==
-        """,
-        """
-        androidx/compose/animation/core/Animatable.class:
-        H4sIAAAAAAAAAI1SW08TQRT+ZrvdtmsLSwUpeENFbQuyaHwgQky8xKRJQQJN
-        X4gPQzvitNtdsjNt8MXwN3z1F2iiIfHBEB/9UcYz23qjPpjNzrnMmfN95/Lt
-        ++cvAO7jHkOVh+04ku0jvxX1DiMlfB7KHtcyCskTC/9RYvL9QGTAGDY2Gg/q
-        HT7gfsDDA//5fke09HrzH76H4y4G76wvA5vB2ZCh1A8ZbpfHH417Kk2GXLnR
-        WG80E32xHsUHfkfo/ZjLUFEFYaSTEpS/1Q8CQ56wU+VKMw8Hros0zjEU9OtD
-        8SQKByLWImYojiPlUcBEDhYmGWz9SiqG5fr/d4xA86YyyYMmD/qCoflfBdbq
-        3UgHMvQ7g54vQ2IX8sB/Kl7yfqCJsdJxv6WjeJPHXRGvD8vKuMRzhlp8IHTj
-        78qmy5V/DSNdrlAHqTHJOfUTdFNo3qYCyGf1BinaFGaONAPrkutIGmuVtPZd
-        hhenx55rlSzXytLvnR6T4pROj6t2lm4YCeZZ96zV1OO5ouPZ89ba6XHRzVpe
-        et4usTX29Z1jec7OzB+2S3ly83Y242UNCC0pa9BPgwYN7Xd3V7qa9mBXHoRc
-        92Nq7sWdfqhlT9TCgVSSIh79XgSa35OoTUGTdRmKrX5vX8QNk8XMPWqZAcXS
-        2CPn4tlc2zzmPUHt/CtpYVfzVneTH46eubtRP26JZ9IYc6MczTE2uEuzSpvO
-        omhWjKwKWRbmUSXpkD9HMkWSBktyiaxtujetd6snyFeXP8H7kLxZpnMiubHp
-        c+iljTtkLQyjMUUYSLTzFMcS7U/MLFZI5qyEDsF6BnSadAO6QUkM0cnL6Tdv
-        aQc2q0vLJ7gwRPaHHLMJhSLBIiHgUEqbADIEPYvSiL5PGQ14uvoR3vtfzJ3E
-        6SSM88OAEeMhu7kzHRl6U1hNZJk6CdTo9iK9u7SHVA2Xa7hCJ66aY6GGa7i+
-        B6ZwA4t7cBWKCjcVbincVjivUFDIKMwqlBQmfgAHXc93GwUAAA==
-        """,
-        """
-        androidx/compose/animation/core/AnimatableKt.class:
-        H4sIAAAAAAAAAJVRTW/TQBB9a+eDuKF1w1frAoVyoRJi08KJIKQKKVKECRKt
-        eslpE6+iTezdyl5HPeYncUQcUM78KMSsGykSXKi1np33/Ha88+bX7x8/AbzF
-        EcMroZPcqOSaT0x2ZQrJhVaZsMpoYnLJzyooxqn8ZJtgDOFMLARPhZ7yL+OZ
-        nBDrMwQbHQN/2T+O/79wj+Hidifex5tL9FMjbC/++1a9D1T2RWzyKZ9JO86F
-        0gUV1MZWFQs+NHZYpmmvjToaATy0GNpKK6tEeinSkvpgfYbdeG5sqjT/LK1I
-        6PdU1ssWPhnIXKiTbO4Sj/hr5bIuZckJw5vVMgxWy8Db8wIvbNJLYLWMItqj
-        7U6t43W9KvpddtoIaxFhd/SUxnI7+8Bwd0O8nluG2keTUAs7sdJyWGZjmV/c
-        DKcTm4nrMFcOr8nWuZpqYcuc8oOvpbYqkwO9UIWiz2cb12jQ56bMJ7Kv3LH9
-        tfTyHyFOyNEa3EMyZzF8HBDihJnz7eg7gm/ONzym2KjIFp5QbN8IsEUZ8LTS
-        NHG4Vt2p8LMqRnhO+zvXPum3R/AH2BkgpIjdATq4N8B9PBiBFXiIRyPUC7f2
-        CuxXa+sP0YZpjAsDAAA=
-        """
-    )
-
     // Simplified Animatable Color function stub, from androidx.compose.animation
     private val AnimatableColorStub = compiledStub(
         filename = "SingleValueAnimation.kt",
@@ -226,7 +168,7 @@
                 }
             """
             ),
-            AnimatableStub,
+            Stubs.Animatable,
             AnimatableColorStub,
             Stubs.Color,
             Stubs.Composable,
@@ -390,7 +332,7 @@
                 }
             """
             ),
-            AnimatableStub,
+            Stubs.Animatable,
             AnimatableColorStub,
             Stubs.Color,
             Stubs.Composable,
@@ -503,7 +445,7 @@
                 }
             """
             ),
-            AnimatableStub,
+            Stubs.Animatable,
             AnimatableColorStub,
             Stubs.Color,
             Stubs.Composable,
diff --git a/compose/animation/animation-core/api/current.txt b/compose/animation/animation-core/api/current.txt
index 7bab3ae..a6d5503 100644
--- a/compose/animation/animation-core/api/current.txt
+++ b/compose/animation/animation-core/api/current.txt
@@ -434,6 +434,7 @@
   public static final class KeyframesSpec.KeyframesSpecConfig<T> {
     ctor public KeyframesSpec.KeyframesSpecConfig();
     method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> atFraction(T?, float fraction);
     method public int getDelayMillis();
     method public int getDurationMillis();
     method public void setDelayMillis(int);
diff --git a/compose/animation/animation-core/api/public_plus_experimental_current.txt b/compose/animation/animation-core/api/public_plus_experimental_current.txt
index ce65bf1..1fd90c0 100644
--- a/compose/animation/animation-core/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation-core/api/public_plus_experimental_current.txt
@@ -440,6 +440,7 @@
   public static final class KeyframesSpec.KeyframesSpecConfig<T> {
     ctor public KeyframesSpec.KeyframesSpecConfig();
     method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> atFraction(T?, float fraction);
     method public int getDelayMillis();
     method public int getDurationMillis();
     method public void setDelayMillis(int);
diff --git a/compose/animation/animation-core/api/restricted_current.txt b/compose/animation/animation-core/api/restricted_current.txt
index 6a874fa..e47f955 100644
--- a/compose/animation/animation-core/api/restricted_current.txt
+++ b/compose/animation/animation-core/api/restricted_current.txt
@@ -434,6 +434,7 @@
   public static final class KeyframesSpec.KeyframesSpecConfig<T> {
     ctor public KeyframesSpec.KeyframesSpecConfig();
     method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> at(T?, int timeStamp);
+    method public infix androidx.compose.animation.core.KeyframesSpec.KeyframeEntity<T> atFraction(T?, float fraction);
     method public int getDelayMillis();
     method public int getDurationMillis();
     method public void setDelayMillis(int);
diff --git a/compose/animation/animation-core/build.gradle b/compose/animation/animation-core/build.gradle
index 113c7c6..c134670 100644
--- a/compose/animation/animation-core/build.gradle
+++ b/compose/animation/animation-core/build.gradle
@@ -37,7 +37,7 @@
         api("androidx.annotation:annotation:1.1.0")
 
         implementation("androidx.compose.runtime:runtime:1.1.1")
-        implementation("androidx.compose.ui:ui:1.2.0-rc02")
+        implementation("androidx.compose.ui:ui:1.2.0")
         implementation("androidx.compose.ui:ui-unit:1.0.0")
         implementation("androidx.compose.ui:ui-util:1.0.0")
         implementation(libs.kotlinStdlib)
diff --git a/compose/animation/animation-core/samples/build.gradle b/compose/animation/animation-core/samples/build.gradle
index c92a3e6..6955b50 100644
--- a/compose/animation/animation-core/samples/build.gradle
+++ b/compose/animation/animation-core/samples/build.gradle
@@ -28,7 +28,7 @@
     implementation(libs.kotlinStdlib)
     compileOnly(project(":annotation:annotation-sampled"))
     implementation(project(":compose:animation:animation-core"))
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.compose.ui:ui:1.0.0")
     implementation("androidx.compose.ui:ui-unit:1.0.0")
     implementation("androidx.compose.foundation:foundation:1.0.0")
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
index d3a6f17..6f3553f 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt
@@ -22,6 +22,7 @@
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.unit.IntOffset
 import kotlin.math.abs
+import kotlin.math.roundToInt
 
 object AnimationConstants {
     /**
@@ -402,6 +403,7 @@
  * You can also provide a custom [Easing] for the interval with use of [with] function applied
  * for the interval starting keyframe.
  * @sample androidx.compose.animation.core.samples.KeyframesBuilderWithEasing
+
  */
 @Immutable
 class KeyframesSpec<T>(val config: KeyframesSpecConfig<T>) : DurationBasedAnimationSpec<T> {
@@ -447,6 +449,17 @@
         }
 
         /**
+         * Adds a keyframe so that the animation value will be the value specified at a fraction of the total
+         * [durationMillis] set. For example:
+         *      0.8f atFraction 0.50f // half of the overall duration set
+         *  @param fraction The fraction when the animation should reach specified value.
+         *  @return an [KeyframeEntity] so a custom [Easing] can be added by [with] method
+         */
+        infix fun T.atFraction(fraction: Float): KeyframeEntity<T> {
+            return at((durationMillis * fraction).roundToInt())
+        }
+
+        /**
          * Adds an [Easing] for the interval started with the just provided timestamp. For example:
          *     0f at 50 with LinearEasing
          *
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
index 63d7e9f..2be302f 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
@@ -24,16 +24,20 @@
 
 /**
  * Target based animation that animates from the given [initialValue] towards the [targetValue],
- * with an optional [initialVelocity]. The [initialVelocity] defaults to 0f. By default, a [spring]
- * will be used for the animation. An alternative [animationSpec] can be provided to replace the
- * default [spring]. On each frame, the [block] will be invoked with up-to-date value and velocity.
+ * with an optional [initialVelocity]. By default, a [spring] will be used for the animation. An
+ * alternative [animationSpec] can be provided to replace the default [spring].
  *
  * This is a convenient method for Float animation. If there's a need to access more info related to
  * the animation such as start time, target, etc, consider using [AnimationState.animateTo].
  * To animate non-[Float] data types, consider the [animate] overload/variant for generic types.
  *
+ * @param initialVelocity The velocity to use for the animation. 0f by default.
+ * @param animationSpec The animation configuration that will be used. [spring] by default.
+ * @param block Will be invoked on every frame with the current value and velocity of the animation
+ * for that frame.
+ *
  * @sample androidx.compose.animation.core.samples.suspendAnimateFloatVariant
- * @see [AnimationState.animateTo]
+ * @see AnimationState.animateTo
  */
 suspend fun animate(
     initialValue: Float,
@@ -56,16 +60,16 @@
  * Decay animation that slows down from the given [initialVelocity] starting at [initialValue] until
  * the velocity reaches 0. This is often used after a fling gesture.
  *
- * [animationSpec] defines the decay animation that will be used for this animation. Some options
- * for this [animationSpec] include: [splineBasedDecay][androidx.compose.animation
- * .splineBasedDecay] and [exponentialDecay]. [block] will be invoked on each animation frame
- * with up-to-date value and velocity.
- *
  * This is a convenient method for decay animation. If there's a need to access more info related to
- * the animation such as start time, target, etc, consider using [AnimationState<Float,
- * AnimationVector1D>.animateDecay].
+ * the animation such as start time, target, etc, consider using [AnimationState.animateDecay].
  *
- * @see [AnimationState<Float, AnimationVector1D>.animateDecay]
+ * @param animationSpec Defines the decay animation that will be used for this animation. Some
+ * options for this [animationSpec] include:
+ * [splineBasedDecay][androidx.compose.animation.splineBasedDecay] and [exponentialDecay].
+ *
+ * @param block Will be invoked on each animation frame with up-to-date value and velocity.
+ *
+ * @see AnimationState.animateDecay
  */
 suspend fun animateDecay(
     initialValue: Float,
@@ -90,7 +94,7 @@
  * related to the animation such as start time, target, etc, consider using
  * [AnimationState.animateTo].
  *
- * @see [AnimationState.animateTo]
+ * @see AnimationState.animateTo
  */
 suspend fun <T, V : AnimationVector> animate(
     typeConverter: TwoWayConverter<T, V>,
@@ -120,14 +124,18 @@
  * animation, the given [AnimationState] will be updated with the up-to-date value/velocity,
  * frame time, etc.
  *
- * [sequentialAnimation] indicates whether the animation should use the
+ * @param targetValue The target value that the animation will animate to.
+ *
+ * @param animationSpec The animation configuration that will be used. [spring] by default.
+ *
+ * @param sequentialAnimation Indicates whether the animation should use the
  * [AnimationState.lastFrameTimeNanos] as the starting time (if true), or start in a new frame. By
  * default, [sequentialAnimation] is false, to start the animation in a few frame. In cases where
  * an on-going animation is interrupted and a new animation is started to carry over the
- * momentum, using the interruption time (captured in [AnimationState.lastFrameTimeNanos] creates
+ * momentum, using the interruption time (captured in [AnimationState.lastFrameTimeNanos]) creates
  * a smoother animation.
  *
- * [block] will be invoked on every frame, and the [AnimationScope] will be checked against
+ * @param block Will be invoked on every frame, and the [AnimationScope] will be checked against
  * cancellation before the animation continues. To cancel the animation from the [block], simply
  * call [AnimationScope.cancelAnimation].  After [AnimationScope.cancelAnimation] is called, [block]
  * will not be invoked again. The animation loop will exit after the [block] returns. All the
@@ -138,7 +146,6 @@
 suspend fun <T, V : AnimationVector> AnimationState<T, V>.animateTo(
     targetValue: T,
     animationSpec: AnimationSpec<T> = spring(),
-    // Indicates whether the animation should start from last frame
     sequentialAnimation: Boolean = false,
     block: AnimationScope<T, V>.() -> Unit = {}
 ) {
@@ -162,26 +169,25 @@
  * with the up-to-date value/velocity, frame time, etc. This is often used to animate the result
  * of a fling gesture.
  *
- * [animationSpec] defines the decay animation that will be used for this animation. Some options
- * for [animationSpec] include: [splineBasedDecay][androidx.compose.animation.splineBasedDecay]
- * and [exponentialDecay].
+ * @param animationSpec Defines the decay animation that will be used for this animation. Some
+ * options for [animationSpec] include:
+ * [splineBasedDecay][androidx.compose.animation.splineBasedDecay] and [exponentialDecay].
  *
- * During the animation, [block] will be invoked on every frame, and the [AnimationScope] will be
- * checked against cancellation before the animation continues. To cancel the animation from the
- * [block], simply call [AnimationScope.cancelAnimation].  After [AnimationScope.cancelAnimation] is
- * called, [block] will not be invoked again. The animation loop will exit after the [block]
- * returns. All the animation related info can be accessed via [AnimationScope].
- *
- * [sequentialAnimation] indicates whether the animation should use the
+ * @param sequentialAnimation Indicates whether the animation should use the
  * [AnimationState.lastFrameTimeNanos] as the starting time (if true), or start in a new frame. By
  * default, [sequentialAnimation] is false, to start the animation in a few frame. In cases where
  * an on-going animation is interrupted and a new animation is started to carry over the
- * momentum, using the interruption time (captured in [AnimationState.lastFrameTimeNanos] creates
+ * momentum, using the interruption time (captured in [AnimationState.lastFrameTimeNanos]) creates
  * a smoother animation.
+ *
+ * @param block will be invoked on every frame during the animation, and the [AnimationScope] will
+ * be checked against cancellation before the animation continues. To cancel the animation from the
+ * [block], simply call [AnimationScope.cancelAnimation].  After [AnimationScope.cancelAnimation] is
+ * called, [block] will not be invoked again. The animation loop will exit after the [block]
+ * returns. All the animation related info can be accessed via [AnimationScope].
  */
 suspend fun <T, V : AnimationVector> AnimationState<T, V>.animateDecay(
     animationSpec: DecayAnimationSpec<T>,
-    // Indicates whether the animation should start from last frame
     sequentialAnimation: Boolean = false,
     block: AnimationScope<T, V>.() -> Unit = {}
 ) {
@@ -203,22 +209,22 @@
  * finish. During the animation, the [AnimationState] will be updated with the up-to-date
  * value/velocity, frame time, etc.
  *
- * If [startTimeNanos] is provided, it will be used as the time that the animation was started. By
- * default, [startTimeNanos] is [AnimationConstants.UnspecifiedTime], meaning the animation will start in the next frame.
- *
  * For [Animation]s that use [AnimationSpec], consider using these more convenient APIs:
- * [animate], [AnimationState.animateTo], [animateDecay],
- * [AnimationState<Float, AnimationVector1D>.animateDecay]
+ * [animate], [AnimationState.animateTo], [animateDecay], [AnimationState.animateDecay].
  *
- * [block] will be invoked on every frame, and the [AnimationScope] will be checked against
+ * @param startTimeNanos If provided, it will be used as the time that the animation was started. By
+ * default, [startTimeNanos] is [AnimationConstants.UnspecifiedTime], meaning the animation will
+ * start in the next frame.
+ *
+ * @param block Will be invoked on every frame, and the [AnimationScope] will be checked against
  * cancellation before the animation continues. To cancel the animation from the [block], simply
  * call [AnimationScope.cancelAnimation].  After [AnimationScope.cancelAnimation] is called, [block]
  * will not be invoked again. The animation loop will exit after the [block] returns. All the
  * animation related info can be accessed via [AnimationScope].
  */
 // TODO: This method uses AnimationState and Animation at the same time, it's potentially confusing
-// as to which is the source of truth for initial value/velocity. Consider letting [Animation] have
-// some suspend fun differently.
+//  as to which is the source of truth for initial value/velocity. Consider letting [Animation] have
+//  some suspend fun differently.
 internal suspend fun <T, V : AnimationVector> AnimationState<T, V>.animate(
     animation: Animation<T, V>,
     startTimeNanos: Long = AnimationConstants.UnspecifiedTime,
diff --git a/compose/animation/animation-core/src/test/java/androidx/compose/animation/core/KeyframeAnimationTest.kt b/compose/animation/animation-core/src/test/java/androidx/compose/animation/core/KeyframeAnimationTest.kt
index afbdcf3..dc1a67a 100644
--- a/compose/animation/animation-core/src/test/java/androidx/compose/animation/core/KeyframeAnimationTest.kt
+++ b/compose/animation/animation-core/src/test/java/androidx/compose/animation/core/KeyframeAnimationTest.kt
@@ -207,4 +207,33 @@
         assertTrue(animation != animationAlteredEasing)
         assertTrue(animation != animationAlteredKeyframes)
     }
+
+    @Test
+    fun percentageBasedKeyFrames() {
+        val start = 0f
+        val end = start // the same
+        val fullTime = 400
+        val animation = keyframes<Float> {
+            durationMillis = fullTime
+            start atFraction 0.25f
+            0.5f atFraction 0.5f
+            0.8f atFraction 0.75f
+            end atFraction 1f
+        }.vectorize(Float.VectorConverter)
+
+        assertThat(animation.at(0)).isEqualTo(start)
+        assertThat(animation.at(250)).isEqualTo(0.65f)
+        assertThat(animation.at(fullTime.toLong())).isEqualTo(end)
+    }
+
+    @Test
+    fun percentageBasedKeyframesWithEasing() {
+        val animation = keyframes<Float> {
+            durationMillis = 100
+            0.5f atFraction 0.5f with FastOutSlowInEasing
+            1f atFraction 1f
+        }.vectorize(Float.VectorConverter)
+
+        assertThat(animation.at(25)).isEqualTo(0.25f)
+    }
 }
diff --git a/compose/animation/animation-graphics/samples/build.gradle b/compose/animation/animation-graphics/samples/build.gradle
index f81727f..61f569c 100644
--- a/compose/animation/animation-graphics/samples/build.gradle
+++ b/compose/animation/animation-graphics/samples/build.gradle
@@ -33,7 +33,7 @@
     implementation(project(":compose:animation:animation-graphics"))
     implementation("androidx.compose.foundation:foundation:1.0.0")
     implementation("androidx.compose.material:material:1.0.0")
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.compose.ui:ui-text:1.0.0")
 }
 
diff --git a/compose/animation/animation-tooling-internal/api/current.txt b/compose/animation/animation-tooling-internal/api/current.txt
index 794514e..dc21e7e 100644
--- a/compose/animation/animation-tooling-internal/api/current.txt
+++ b/compose/animation/animation-tooling-internal/api/current.txt
@@ -26,9 +26,17 @@
   public enum ComposeAnimationType {
     method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
   }
 
   public final class TransitionInfo {
diff --git a/compose/animation/animation-tooling-internal/api/public_plus_experimental_current.txt b/compose/animation/animation-tooling-internal/api/public_plus_experimental_current.txt
index 794514e..dc21e7e 100644
--- a/compose/animation/animation-tooling-internal/api/public_plus_experimental_current.txt
+++ b/compose/animation/animation-tooling-internal/api/public_plus_experimental_current.txt
@@ -26,9 +26,17 @@
   public enum ComposeAnimationType {
     method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
   }
 
   public final class TransitionInfo {
diff --git a/compose/animation/animation-tooling-internal/api/restricted_current.txt b/compose/animation/animation-tooling-internal/api/restricted_current.txt
index 794514e..dc21e7e 100644
--- a/compose/animation/animation-tooling-internal/api/restricted_current.txt
+++ b/compose/animation/animation-tooling-internal/api/restricted_current.txt
@@ -26,9 +26,17 @@
   public enum ComposeAnimationType {
     method public static androidx.compose.animation.tooling.ComposeAnimationType valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.compose.animation.tooling.ComposeAnimationType[] values();
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATABLE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_CONTENT;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VALUE;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATED_VISIBILITY;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_CONTENT_SIZE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType ANIMATE_X_AS_STATE;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType DECAY_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType INFINITE_TRANSITION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TARGET_BASED_ANIMATION;
     enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType TRANSITION_ANIMATION;
+    enum_constant public static final androidx.compose.animation.tooling.ComposeAnimationType UNSUPPORTED;
   }
 
   public final class TransitionInfo {
diff --git a/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt b/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt
index 754343b..59b8371 100644
--- a/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt
+++ b/compose/animation/animation-tooling-internal/src/main/java/androidx/compose/animation/tooling/ComposeAnimation.kt
@@ -24,7 +24,29 @@
  * with it.
  */
 public enum class ComposeAnimationType {
-    TRANSITION_ANIMATION, ANIMATED_VALUE, ANIMATED_VISIBILITY
+    TRANSITION_ANIMATION, ANIMATED_VALUE, ANIMATED_VISIBILITY,
+    /** `Animatable` compose animation. */
+    ANIMATABLE,
+    /** `animateContentSize` compose animation. */
+    ANIMATE_CONTENT_SIZE,
+    /**
+     * `animateXAsState` animations, for example `animateDpAsState`, `animateIntAsState`.
+     * Includes `animateValueAsState`.
+     */
+    ANIMATE_X_AS_STATE,
+    /** `AnimatedContent` animation. */
+    ANIMATED_CONTENT,
+    /** `DecayAnimation` animation. */
+    DECAY_ANIMATION,
+    /** `rememberInfiniteTransition` animation. */
+    INFINITE_TRANSITION,
+    /** `TargetBasedAnimation` animation. */
+    TARGET_BASED_ANIMATION,
+    /**
+     * Detected animation without a support - only [ComposeAnimation.label] and
+     * [ComposeAnimation.type] are provided.
+     */
+    UNSUPPORTED
 }
 
 /**
diff --git a/compose/animation/animation/samples/build.gradle b/compose/animation/animation/samples/build.gradle
index c7939d12..f6dacc1 100644
--- a/compose/animation/animation/samples/build.gradle
+++ b/compose/animation/animation/samples/build.gradle
@@ -32,7 +32,7 @@
     implementation(project(":compose:animation:animation"))
     implementation("androidx.compose.foundation:foundation:1.0.0")
     implementation("androidx.compose.material:material:1.0.0")
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.compose.ui:ui-text:1.0.0")
 }
 
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
index 5fbdfd9..897c193 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamTransformTests.kt
@@ -380,13 +380,7 @@
             fun Example(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
               %composer.startReplaceableGroup(<>)
               sourceInformation(%composer, "C(Example)<conten...>:Test.kt#2487m")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
               content(%composer, 0b1110 and %changed)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
               %composer.endReplaceableGroup()
             }
             @NonRestartableComposable
@@ -401,13 +395,7 @@
                 %composer.startReplaceableGroup(<>)
                 sourceInformation(%composer, "C:Test.kt#2487m")
                 if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
                   Unit
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
                 } else {
                   %composer.skipToGroupEnd()
                 }
@@ -670,28 +658,16 @@
                       %composer.startReplaceableGroup(<>)
                       sourceInformation(%composer, "C<emit>:Test.kt#2487m")
                       if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                        if (isTraceInProgress()) {
-                          traceEventStart(<>, %changed, -1, <>)
-                        }
                         emit({ %composer: Composer?, %changed: Int ->
                           %composer.startReplaceableGroup(<>)
                           sourceInformation(%composer, "C<compos...>:Test.kt#2487m")
                           if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                            if (isTraceInProgress()) {
-                              traceEventStart(<>, %changed, -1, <>)
-                            }
                             composable(%composer, 0b1110 and %dirty)
-                            if (isTraceInProgress()) {
-                              traceEventEnd()
-                            }
                           } else {
                             %composer.skipToGroupEnd()
                           }
                           %composer.endReplaceableGroup()
                         }, %composer, 0)
-                        if (isTraceInProgress()) {
-                          traceEventEnd()
-                        }
                       } else {
                         %composer.skipToGroupEnd()
                       }
@@ -712,13 +688,7 @@
                 fun emit(composable: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
                   %composer.startReplaceableGroup(<>)
                   sourceInformation(%composer, "C(emit)<compos...>:Test.kt#2487m")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
                   composable(%composer, 0b1110 and %changed)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
                   %composer.endReplaceableGroup()
                 }
             """.trimIndent()
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
index 0659dd6..8506e01 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
@@ -250,18 +250,9 @@
                 %composer.startReplaceableGroup(<>)
                 sourceInformation(%composer, "C<A()>:Test.kt")
                 if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
                   if (condition) {
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
                   }
                   A(%composer, 0)
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
                 } else {
                   %composer.skipToGroupEnd()
                 }
@@ -277,13 +268,7 @@
             fun FakeBox(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
               %composer.startReplaceableGroup(<>)
               sourceInformation(%composer, "C(FakeBox)<conten...>:Test.kt")
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
               content(%composer, 0b1110 and %changed)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
               %composer.endReplaceableGroup()
             }
         """
@@ -2988,13 +2973,7 @@
                   %composer.startReplaceableGroup(<>)
                   sourceInformation(%composer, "C<A()>:Test.kt")
                   if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
                     A(%composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
                   } else {
                     %composer.skipToGroupEnd()
                   }
@@ -4340,9 +4319,6 @@
                     %composer.startReplaceableGroup(<>)
                     sourceInformation(%composer, "C<T(2)>,<T(4)>:Test.kt")
                     if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                      if (isTraceInProgress()) {
-                        traceEventStart(<>, %changed, -1, "ComposableSingletons%TestKt.lambda-1.<anonymous>.<anonymous> (Test.kt:6)")
-                      }
                       T(2, %composer, 0b0110)
                       %composer.startReplaceableGroup(<>)
                       sourceInformation(%composer, "*<T(3)>")
@@ -4351,9 +4327,6 @@
                       }
                       %composer.endReplaceableGroup()
                       T(4, %composer, 0b0110)
-                      if (isTraceInProgress()) {
-                        traceEventEnd()
-                      }
                     } else {
                       %composer.skipToGroupEnd()
                     }
@@ -4440,13 +4413,7 @@
                   %composer.startReplaceableGroup(<>)
                   sourceInformation(%composer, "C<Text("...>:Test.kt")
                   if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, "Test.<anonymous> (Test.kt:19)")
-                    }
                     Text("%c %cl", %composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
                   } else {
                     %composer.skipToGroupEnd()
                   }
@@ -4520,13 +4487,7 @@
                 @ReadOnlyComposable @Composable @JvmName(name = "getCurrent")
                 get() {
                   sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, "CurrentHolder.<get-current> (Test.kt:8)")
-                  }
                   val tmp0 = 0
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
                   sourceInformationMarkerEnd(%composer)
                   return tmp0
                 }
@@ -4580,13 +4541,7 @@
                   %composer.startReplaceableGroup(<>)
                   sourceInformation(%composer, "C<Text("...>:Test.kt")
                   if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, "Test.<anonymous> (Test.kt:31)")
-                    }
                     Text("%c %cl", %composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
                   } else {
                     %composer.skipToGroupEnd()
                   }
@@ -4680,9 +4635,6 @@
                   %composer.startReplaceableGroup(<>)
                   sourceInformation(%composer, "C*<Leaf(0...>:Test.kt")
                   if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
                     repeat(1) { it: Int ->
                       %composer.startReplaceableGroup(<>)
                       sourceInformation(%composer, "*<Leaf(0...>")
@@ -4692,9 +4644,6 @@
                       %composer.endReplaceableGroup()
                       Leaf(0, %composer, 0b0110, 0)
                     }
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
                   } else {
                     %composer.skipToGroupEnd()
                   }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
index 6d2b849..73d7003ba 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTestsNoSource.kt
@@ -156,13 +156,7 @@
                 }
                 IW({ %composer: Composer?, %changed: Int ->
                   if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                    if (isTraceInProgress()) {
-                      traceEventStart(<>, %changed, -1, <>)
-                    }
                     A(%composer, 0)
-                    if (isTraceInProgress()) {
-                      traceEventEnd()
-                    }
                   } else {
                     %composer.skipToGroupEnd()
                   }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
index 4d2280d..fc98ac8 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/DefaultParamTransformTests.kt
@@ -200,13 +200,7 @@
               %composer.startReplaceableGroup(<>)
               sourceInformation(%composer, "C:Test.kt")
               if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
                 Unit
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
               } else {
                 %composer.skipToGroupEnd()
               }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
index e46e9b4..c53597f 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/FunctionBodySkippingTransformTests.kt
@@ -2592,24 +2592,12 @@
               if (%default and 0b0001 !== 0) {
                 label = ""
               }
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
               c(<this>, label, %composer, 0b1110 and %changed or 0b01110000 and %changed)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
             }
             @Composable
             @ExplicitGroupsComposable
             fun c(foo: Foo, label: String, %composer: Composer?, %changed: Int) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
               print(label)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
             }
         """
     )
@@ -3345,13 +3333,7 @@
                 @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
                 get() {
                   sourceInformationMarkerStart(%composer, <>, "C:Test.kt")
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
                   val tmp0 = %composer.hashCode()
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
                   sourceInformationMarkerEnd(%composer)
                   return tmp0
                 }
@@ -3932,13 +3914,7 @@
               val current: Int
                 @Composable @ReadOnlyComposable @JvmName(name = "getCurrent")
                 get() {
-                  if (isTraceInProgress()) {
-                    traceEventStart(<>, %changed, -1, <>)
-                  }
                   val tmp0 = %composer.hashCode()
-                  if (isTraceInProgress()) {
-                    traceEventEnd()
-                  }
                   return tmp0
                 }
               @ReadOnlyComposable
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
index 1281225..0153148 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TargetAnnotationsTransformTests.kt
@@ -235,13 +235,7 @@
               %composer.startReplaceableGroup(<>)
               sourceInformation(%composer, "C<Text("...>:Test.kt")
               if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
                 Text("test", %composer, 0b0110)
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
               } else {
                 %composer.skipToGroupEnd()
               }
@@ -918,29 +912,17 @@
           if (%default and 0b0001 !== 0) {
             modifier = Companion
           }
-          if (isTraceInProgress()) {
-            traceEventStart(<>, %changed, -1, <>)
-          }
           val tmp0_measurePolicy = localBoxMeasurePolicy
           Layout({ %composer: Composer?, %changed: Int ->
             %composer.startReplaceableGroup(<>)
             sourceInformation(%composer, "C<conten...>:Test.kt")
             if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-              if (isTraceInProgress()) {
-                traceEventStart(<>, %changed, -1, <>)
-              }
               content(LocalBoxScopeInstance, %composer, 0b0110 or 0b01110000 and %changed)
-              if (isTraceInProgress()) {
-                traceEventEnd()
-              }
             } else {
               %composer.skipToGroupEnd()
             }
             %composer.endReplaceableGroup()
           }, modifier, tmp0_measurePolicy, %composer, 0b000110000000 or 0b01110000 and %changed shl 0b0011, 0)
-          if (isTraceInProgress()) {
-            traceEventEnd()
-          }
           %composer.endReplaceableGroup()
         }
         """
@@ -1010,13 +992,7 @@
               %composer.startReplaceableGroup(<>)
               sourceInformation(%composer, "C:Test.kt")
               if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
-                if (isTraceInProgress()) {
-                  traceEventStart(<>, %changed, -1, <>)
-                }
                 Unit
-                if (isTraceInProgress()) {
-                  traceEventEnd()
-                }
               } else {
                 %composer.skipToGroupEnd()
               }
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
index f261e6e4..a186777 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/TraceInformationTest.kt
@@ -85,4 +85,85 @@
         """,
         truncateTracingInfoMode = TruncateTracingInfoMode.TRUNCATE_KEY
     )
+
+    @Test
+    fun testInlineFunctionsDonotGenerateTraceMarkers() = verifyComposeIrTransform(
+        """
+            import androidx.compose.runtime.*
+
+            @Composable
+            inline fun Wrapper(content: @Composable () -> Unit) = content()
+
+            @Composable
+            fun Test(condition: Boolean) {
+                A()
+                Wrapper {
+                    A()
+                    if (!condition) return
+                    A()
+                }
+                A()
+            }
+        """,
+        """
+            @Composable
+            @ComposableInferredTarget(scheme = "[0[0]]")
+            fun Wrapper(content: Function2<Composer, Int, Unit>, %composer: Composer?, %changed: Int) {
+              %composer.startReplaceableGroup(<>)
+              sourceInformation(%composer, "C(Wrapper)<conten...>:Test.kt")
+              content(%composer, 0b1110 and %changed)
+              %composer.endReplaceableGroup()
+            }
+            @Composable
+            fun Test(condition: Boolean, %composer: Composer?, %changed: Int) {
+              %composer = %composer.startRestartGroup(<>)
+              sourceInformation(%composer, "C(Test)<A()>,<Wrappe...>,<A()>:Test.kt")
+              val %dirty = %changed
+              if (%changed and 0b1110 === 0) {
+                %dirty = %dirty or if (%composer.changed(condition)) 0b0100 else 0b0010
+              }
+              if (%dirty and 0b1011 !== 0b0010 || !%composer.skipping) {
+                if (isTraceInProgress()) {
+                  traceEventStart(<>, %changed, -1, <>)
+                }
+                A(%composer, 0)
+                Wrapper({ %composer: Composer?, %changed: Int ->
+                  %composer.startReplaceableGroup(<>)
+                  sourceInformation(%composer, "C<A()>,<A()>:Test.kt")
+                  if (%changed and 0b1011 !== 0b0010 || !%composer.skipping) {
+                    A(%composer, 0)
+                    if (!condition) {
+                      if (isTraceInProgress()) {
+                        traceEventEnd()
+                      }
+                      %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+                        Test(condition, %composer, %changed or 0b0001)
+                      }
+                      return
+                    }
+                    A(%composer, 0)
+                  } else {
+                    %composer.skipToGroupEnd()
+                  }
+                  %composer.endReplaceableGroup()
+                }, %composer, 0)
+                A(%composer, 0)
+                if (isTraceInProgress()) {
+                  traceEventEnd()
+                }
+              } else {
+                %composer.skipToGroupEnd()
+              }
+              %composer.endRestartGroup()?.updateScope { %composer: Composer?, %force: Int ->
+                Test(condition, %composer, %changed or 0b0001)
+              }
+            }
+        """,
+        """
+            import androidx.compose.runtime.*
+
+            @Composable
+            fun A() { }
+        """
+    )
 }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
index dd2a1cc..c3fb540 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
@@ -99,7 +99,7 @@
          * The maven version string of this compiler. This string should be updated before/after every
          * release.
          */
-        const val compilerVersion: String = "1.3.0-rc01"
+        const val compilerVersion: String = "1.3.0-rc02"
         private val minimumRuntimeVersion: String
             get() = versionTable[minimumRuntimeVersionInt] ?: "unknown"
     }
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index c8987c1..85953db 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -641,6 +641,8 @@
         }
     }
 
+    private val traceEventMarkersEnabled get() = traceEventEndFunction != null
+
     private val sourceInformationMarkerEndFunction by guardedLazy {
         getTopLevelFunctions(
             ComposeFqNames.fqNameFor(KtxNameConventions.SOURCEINFORMATIONMARKEREND)
@@ -866,9 +868,13 @@
 
         var (transformed, returnVar) = body.asBodyAndResultVar()
 
+        val emitTraceMarkers = traceEventMarkersEnabled && !scope.function.isInline
+
         transformed = transformed.apply {
             transformChildrenVoid()
-            wrapWithTraceEvents(irFunctionSourceKey(), scope)
+            if (emitTraceMarkers) {
+                wrapWithTraceEvents(irFunctionSourceKey(), scope)
+            }
         }
 
         buildPreambleStatementsAndReturnIfSkippingPossible(
@@ -886,7 +892,7 @@
         if (!elideGroups) {
             scope.realizeGroup {
                 irComposite(statements = listOfNotNull(
-                    irTraceEventEnd(),
+                    if (emitTraceMarkers) irTraceEventEnd() else null,
                     irEndReplaceableGroup()
                 ))
             }
@@ -996,11 +1002,15 @@
 
         val (nonReturningBody, returnVar) = body.asBodyAndResultVar()
 
+        val emitTraceMarkers = traceEventMarkersEnabled && !scope.isInlinedLambda
+
         // we must transform the body first, since that will allow us to see whether or not we
         // are using the dispatchReceiverParameter or the extensionReceiverParameter
         val transformed = nonReturningBody.apply {
             transformChildrenVoid()
-            wrapWithTraceEvents(irFunctionSourceKey(), scope)
+            if (emitTraceMarkers) {
+                wrapWithTraceEvents(irFunctionSourceKey(), scope)
+            }
         }
 
         canSkipExecution = buildPreambleStatementsAndReturnIfSkippingPossible(
@@ -1020,7 +1030,7 @@
             dirty
         } else changedParam
 
-        if (traceEventEndFunction != null) {
+        if (emitTraceMarkers) {
             scope.realizeEndCalls {
                 irTraceEventEnd()!!
             }
diff --git a/compose/foundation/foundation-layout/build.gradle b/compose/foundation/foundation-layout/build.gradle
index f2d096c..da16e2b 100644
--- a/compose/foundation/foundation-layout/build.gradle
+++ b/compose/foundation/foundation-layout/build.gradle
@@ -35,10 +35,10 @@
          */
 
         api("androidx.annotation:annotation:1.1.0")
-        api("androidx.compose.ui:ui:1.2.0-rc02")
+        api("androidx.compose.ui:ui:1.2.0")
         api("androidx.compose.ui:ui-unit:1.1.1")
 
-        implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+        implementation("androidx.compose.runtime:runtime:1.2.0")
         implementation("androidx.compose.ui:ui-util:1.0.0")
         implementation("androidx.core:core:1.7.0")
         implementation("androidx.compose.animation:animation-core:1.1.1")
diff --git a/compose/foundation/foundation-layout/samples/build.gradle b/compose/foundation/foundation-layout/samples/build.gradle
index 8bcba17..832d9f0 100644
--- a/compose/foundation/foundation-layout/samples/build.gradle
+++ b/compose/foundation/foundation-layout/samples/build.gradle
@@ -31,7 +31,7 @@
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation("androidx.compose.material:material:1.0.0")
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.compose.ui:ui:1.0.0")
     implementation("androidx.compose.ui:ui-text:1.0.0")
     implementation("androidx.core:core-ktx:1.7.0")
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
index 0d71162..ef9e339 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationIssueRegistry.kt
@@ -30,7 +30,8 @@
     override val api = 13
     override val minApi = CURRENT_API
     override val issues get() = listOf(
-        LazyLayoutStateReadInCompositionDetector.FrequentlyChangedStateReadInComposition
+        LazyLayoutStateReadInCompositionDetector.FrequentlyChangedStateReadInComposition,
+        NonLambdaOffsetModifierDetector.UseOfNonLambdaOverload
     )
     override val vendor = Vendor(
         vendorName = "Jetpack Compose",
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationNames.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationNames.kt
index aabe6c4..29a5568 100644
--- a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationNames.kt
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/FoundationNames.kt
@@ -31,4 +31,10 @@
             val LazyGridState = Name(PackageName, "LazyGridState")
         }
     }
+
+    object Layout {
+        val PackageName = Package(FoundationNames.PackageName, "layout")
+        val Offset = Name(PackageName, "offset")
+        val AbsoluteOffset = Name(PackageName, "absoluteOffset")
+    }
 }
\ No newline at end of file
diff --git a/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetector.kt b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetector.kt
new file mode 100644
index 0000000..673f5be
--- /dev/null
+++ b/compose/foundation/foundation-lint/src/main/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetector.kt
@@ -0,0 +1,157 @@
+/*
+ * 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:Suppress("UnstableApiUsage")
+
+package androidx.compose.foundation.lint
+
+import androidx.compose.lint.Names
+import androidx.compose.lint.inheritsFrom
+import androidx.compose.lint.isInPackageName
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.android.tools.lint.detector.api.UastLintUtils.Companion.tryResolveUDeclaration
+import com.intellij.psi.PsiMethod
+import com.intellij.psi.util.ClassUtil
+import java.util.EnumSet
+import org.jetbrains.kotlin.psi.KtProperty
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UDeclaration
+import org.jetbrains.uast.UExpression
+import org.jetbrains.uast.ULocalVariable
+import org.jetbrains.uast.UMethod
+import org.jetbrains.uast.USimpleNameReferenceExpression
+import org.jetbrains.uast.UVariable
+import org.jetbrains.uast.skipParenthesizedExprDown
+import org.jetbrains.uast.toUElement
+import org.jetbrains.uast.visitor.AbstractUastVisitor
+
+/**
+ * [Detector] that checks calls to Modifier.offset that use a non-lambda overload but read from
+ * dynamic/state variables. It is recommended to use the lambda overload in those cases for
+ * performance improvements
+ */
+class NonLambdaOffsetModifierDetector : Detector(), SourceCodeScanner {
+
+    override fun getApplicableMethodNames(): List<String> = listOf(
+        FoundationNames.Layout.Offset.shortName,
+        FoundationNames.Layout.AbsoluteOffset.shortName
+    )
+
+    override fun visitMethodCall(context: JavaContext, node: UCallExpression, method: PsiMethod) {
+        // Non Modifier Offset
+        if (!method.isInPackageName(FoundationNames.Layout.PackageName)) return
+
+        if (method.isDesiredOffsetOverload() && hasStateBackedArguments(node)) {
+            context.report(
+                UseOfNonLambdaOverload,
+                node,
+                context.getNameLocation(node),
+                ReportMainMessage
+            )
+        }
+    }
+
+    /**
+     * Has two parameters of type DP
+     */
+    private fun PsiMethod.isDesiredOffsetOverload(): Boolean {
+        // use signature
+        return ClassUtil.getAsmMethodSignature(this) == OffsetSignature
+    }
+
+    private fun hasStateBackedArguments(node: UCallExpression): Boolean {
+        var dynamicArguments = false
+
+        node.valueArguments
+            .forEach { expression ->
+                expression.accept(object : AbstractUastVisitor() {
+                    override fun visitSimpleNameReferenceExpression(
+                        node: USimpleNameReferenceExpression
+                    ): Boolean {
+                        val declaration = node.tryResolveUDeclaration() ?: return false
+                        dynamicArguments = dynamicArguments || declaration.isCompositionAwareType()
+                        return dynamicArguments
+                    }
+                })
+            }
+
+        return dynamicArguments
+    }
+
+    companion object {
+        const val ReportMainMessage =
+            "State backed values should use the lambda overload of Modifier.offset"
+
+        const val IssueId = "UseOfNonLambdaOffsetOverload"
+
+        val UseOfNonLambdaOverload = Issue.create(
+            IssueId,
+            "Modifier.offset{ } is preferred over Modifier.offset() for " +
+                "`State` backed arguments.",
+            "`Modifier.offset()` is recommended to be used with static arguments only to " +
+                "avoid unnecessary recompositions. `Modifier.offset{ }` is " +
+                "preferred in the cases where the arguments are backed by a `State`.",
+            Category.PERFORMANCE, 3, Severity.WARNING,
+            Implementation(
+                NonLambdaOffsetModifierDetector::class.java,
+                EnumSet.of(Scope.JAVA_FILE, Scope.TEST_SOURCES)
+            )
+        )
+    }
+}
+
+private fun UDeclaration.isCompositionAwareType(): Boolean {
+    return isDelegateOfState() || isMethodFromStateOrAnimatable() || isStateOrAnimatableVariable()
+}
+
+private fun UDeclaration.isStateOrAnimatableVariable(): Boolean {
+    return (this is UVariable) &&
+        (type.inheritsFrom(Names.Runtime.State) ||
+            type.inheritsFrom(Names.Animation.Core.Animatable))
+}
+
+/**
+ * Special handling of implicit receiver types
+ */
+private fun UDeclaration.isMethodFromStateOrAnimatable(): Boolean {
+    val argument = this as? UMethod
+    val containingClass = argument?.containingClass ?: return false
+
+    return containingClass.inheritsFrom(Names.Runtime.State) ||
+        containingClass.inheritsFrom(Names.Animation.Core.Animatable)
+}
+
+private fun UDeclaration.isDelegateOfState(): Boolean {
+    val localVariable = this as? ULocalVariable
+    val ktProperty = localVariable?.sourcePsi as? KtProperty ?: return false
+    val delegateExpression =
+        ktProperty.delegate?.expression.toUElement() as? UExpression ?: return false
+    val cleanCallExpression =
+        (delegateExpression.skipParenthesizedExprDown() as? UCallExpression) ?: return false
+
+    return cleanCallExpression.returnType?.inheritsFrom(Names.Runtime.State) ?: false
+}
+
+private const val OffsetSignature =
+    "(Landroidx/compose/ui/Modifier;Landroidx/compose/ui/unit/Dp;Landroidx/compose/ui/unit/Dp;)" +
+        "Landroidx/compose/ui/Modifier;"
\ No newline at end of file
diff --git a/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetectorTest.kt b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetectorTest.kt
new file mode 100644
index 0000000..6f0752c
--- /dev/null
+++ b/compose/foundation/foundation-lint/src/test/java/androidx/compose/foundation/lint/NonLambdaOffsetModifierDetectorTest.kt
@@ -0,0 +1,1415 @@
+/*
+ * 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.foundation.lint
+
+import androidx.compose.lint.test.Stubs
+import androidx.compose.lint.test.compiledStub
+import androidx.compose.lint.test.kotlinAndCompiledStub
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class NonLambdaOffsetModifierDetectorTest : LintDetectorTest() {
+
+    private val WarningMessage =
+        "Warning: ${NonLambdaOffsetModifierDetector.ReportMainMessage} " +
+            "[${NonLambdaOffsetModifierDetector.IssueId}]"
+
+    private val OffsetStub: TestFile = compiledStub(
+        filename = "Offset.kt",
+        filepath = "androidx/compose/foundation/layout",
+        checksum = 0xd449361a,
+        source = """
+        package androidx.compose.foundation.layout
+
+        import androidx.compose.ui.Modifier
+        import androidx.compose.ui.unit.Dp
+        import androidx.compose.ui.unit.dp
+        import androidx.compose.ui.unit.IntOffset
+        import androidx.compose.ui.unit.Density
+
+        fun Modifier.offset(x: Dp = 0.dp, y: Dp = 0.dp): Modifier = this.then(Modifier)
+        fun Modifier.absoluteOffset(x: Dp = 0.dp, y: Dp = 0.dp): Modifier = this.then(Modifier)
+        fun Modifier.offset(offset: Density.() -> IntOffset): Modifier = this.then(Modifier)
+        fun Modifier.absoluteOffset(offset: Density.() -> IntOffset): Modifier = this.then(Modifier)
+
+        """,
+        """
+                META-INF/main.kotlin_module:
+                H4sIAAAAAAAAAGNgYGBmYGBgBGJ2KM3ApcellJiXUpSfmVKhl5yfW5BfnKqX
+                ll+al5JYkpmfp5eTWJlfWiLE4Z+WVpxa4l3CpcAlgaG+NFOvNC+zRIjFpcC7
+                RIlBiwEAXUlt+WoAAAA=
+                """,
+        """
+                androidx/compose/foundation/layout/OffsetKt.class:
+                H4sIAAAAAAAAALVW3U8jVRT/3en3tOyW8rXAwtZtdaGwTAcXVimiyIdWWkC7
+                ITFEk2k7LQPtTNOZIfBi9skX/wDjqy++GhPjuiaG+Ogftdlzpx+UD9sVtMnc
+                e+6555z7O79z53T+fvXyTwBP8DnDjKIX64ZWPJEKRrVmmKpUMmy9qFiaoUsV
+                5dSwLWmnVDJVa8vygTGED5VjhXb0srSTP1QLpHUxeA3HhuFkKnMloq1JWaOo
+                lTS1nrp219Y1S1qvdd+c7h6YIZYx6mXpULXydUXTTUnRdcNyEjGlbcPatisV
+                svIuWweaueKHn2HyyLAqmi4dHlclTbfUuq5UpLRu1cldK5g+iAxDhQO1cNT0
+                31XqSlUlQ4ZHU5nLTKQ6NDkepJya3gshhD4RQdxhYCd+hGk69SPCcL9bPj4M
+                MgTWaEPRKQOG7rzG25apEIYxEsAQ7jG4rQOVfFd6FKUHtSGMYTxIEe8zhOKc
+                vnir3JO9ijLRtaYMdxqR4kW1pNgVivjd/3aB0lcL1vNOjXcJ6EOMXyeNVitE
+                9dQmL/bbeEdEHI9C8MArQsA0gxjX4qV4WbXWa1T8NEOwQWKxFteOiQIlbxoV
+                21J3mqQONrYvq4cvKlqUhTDXOElm+LoXeR0XvmTrhcbLsdmU5N58/HS7A5Yf
+                d6mQSi+dddqlhvRmNlJPrfRC6oeHIdorXYb+lklWtRTqegrphOqxi9oj44OP
+                CnbEBYH0JxqXkiQVietfz55HxbPnonBPaE2dT3tnLBamQUiyBD3zI2FhbCDi
+                jghJtzN6kq6/fvQKfu/YZKeZ3y+EfbTyO1KASxRHeKMwQrcoHPw8Q6SVdycZ
+                D3sXhyH+JvXhjaF5wMaJxX0NvXXSs9OaSgaBhuncEd1s95pRVBnuZjRd3bar
+                ebX+TMlXVA7TKCiVPaWu8XVTOf6FrVtaVU3rx5qpkWr1vNETvsu77Z59wawv
+                ZymFo6xSawYN5LSyrlh2nWQxZ9j1grqp8Y3BxmJdzdvldi4Mo81j9q5AgEzv
+                ohv858UobwNw4RNafUV6foEeJCKBF7g7E+mncTYyQGPiF4yeYeh3TAj4md82
+                fOq4EwMQkSY52nDFJD1wpDDpmCNFSBLwWdPDR/MWPQOu5qJjDAfwFh6SzPF8
+                TyH5zsKE+5sfMOha9LgWvX8g/uWQ59vf6P9mwnOdOpuYmX2BBEfpQoZGN4SR
+                YQfvMCULwhsibCM0x2iea+JPkF2I5BnMEsoA+vCYJA/ZtHTRtm6Ud7TbkRa8
+                QJp0W9KS/wlp8/9MWpDI6SfSgkRIP6UfvAFpHrxL9hxkljITaB5tkbbQlS7+
+                iZJ2oDhO7TvGQy7SftaxfnKFrD7hAlm8bDdG0HcBgXQzBC5sO4ab2CEVy2VX
+                d8V2mxG3nIYkJnLRlrQpzkTl6LnFv/gWJs/56HrtWq/zTwSyS2REOSbPygtL
+                srgQm1+SFxvT03MgTm+5HRp+SjIm8+iyzGcKvyFil+hIEzlPicf39uFK4/00
+                lmhEKo1lfJDGCj7cBzPxEVb3IZqYM/HAhMfExybWTKyb2DARNhE1EXkN1SFU
+                dTgMAAA=
+                """
+    )
+
+    // common_typos_disable
+    private val AnotherOffsetDefinitionStub = kotlinAndCompiledStub(
+        filename = "InitialTestPackage.kt",
+        filepath = "initial/test/pack",
+        checksum = 0xd4dfae47,
+        source = """
+            package initial.test.pack
+
+            class OffsetClass {
+                fun offset(x: Int, y: Int): Int {
+                    return x + y
+                }
+
+                fun absoluteOffset(x: Int, y: Int): Int {
+                    return x + y
+                }
+            }
+
+            data class AnotherClass(val property: Int)
+
+            fun AnotherClass.offset(x: Int, y: Int): Int {
+                return x + y
+            }
+
+            fun AnotherClass.absoluteOffset(x: Int, y: Int): Int {
+                return x + y
+            }
+
+        """,
+        """
+                META-INF/main.kotlin_module:
+                H4sIAAAAAAAAAGNgYGBmYGBgBGJ2KM3AJc0lmJiXX5KRWqRXklpcoleQmJwt
+                xBYCZHqXcGlyCWbmZZZkJuYgSYp4QoRAagKAAonpqd4lSgxaDACYtrgJYAAA
+                AA==
+                """,
+        """
+                initial/test/pack/AnotherClass.class:
+                H4sIAAAAAAAAAIVU308cVRT+7sz+mB0WmIVCKay0yorL0nYAW62FooBWBgFJ
+                aYgVXy674zIwzKwzd4m+GJ76JzTRFxNjfOKhJgrGJg1t3/ybjPHcnemCC4Fk
+                5txzz5zzne+ce+78/e9fzwHcwjLDoOM5wuGuKexQmDVe3jZnPF9s2sGcy8Mw
+                DcZgbPFdbrrcq5qfb2zZZZGGypCakqHTDImiNbLGoBZH1rJIIq0jAY1BqwV+
+                zQ7EdwzMykJHWwYKsuQvNp2Q4dri+aknGdqqtlhpolACi0Ev+zs137M9MU5Q
+                Zb9GX4aIwcVoQ4t+UDW3bLERcMcLTe7Rdy4cn/RlXyzXXXdSFpDSiWcvQ1aC
+                Fyr217zuCoa14kUpLGuxtVOTF/LKohuXZMZ+apnwV0XgeFWGS8WRE2CRlWq4
+                3GqbrTtuxQ7SGNRxVba99yR68fUZ3NPwJh0Zr9Vsr8Jwo3ga/HS+GJsoDqEg
+                4d9myMtWn+f4jnQsSse58x1L0nE0izzekNoNKn+Th5tzfsVmyB1HWp6wq7LC
+                sWjUaJZMTOgYx7tUkf1Nnbs0TT3FM3r/JUPhvEOnE+cbrk19TTZ6xtB1GoXI
+                LG77wnU8c8kWvMIFJ5uys6vSHWJSpGnCt8n0rSN3RFOp0Gz+crQ3qCt9iq4Y
+                R3s6PYqh6YqWorWNVpXWDu3lY63vaG9CGWOz7V0pQ+lXxtSXP6cUI7GQMdJy
+                N//qsbrQbWikk6OmKZETmRmZM6TrE5rR1p/oY2Ns/tUTlQKzkccTRno76R1S
+                f5BrwmtEpz+hJY2U5DrBqA70WNGcPqQxXaEp5VX75jaNfSI6kE6aY3u5vrNh
+                Bw9lz2Sr/DJ313jgyH1sHHhQ94SzY1verhM6ZJo57jdD+6og5CVei70Lrd4r
+                POA7trCD/4Xpq349KNv3HRlzJY5ZO4VPE6HQr0cW0yV/N6RppNOFJnmfdtP0
+                XaFVLx0iUxr4A+2/0U7BpySlD9CBeZK9kRftOoGGJtFoDmDQG2GZtMqIZOl3
+                tO+fCZONHGKYHJF6HTzUGszODKAfA8HKgHGoDU6ZZ1AeDRzi8tNmUEQ20ySb
+                iclaMZsewMigD1fi3MNxk3L5xPc/QJMMpkoDBxiIIBdIqmASgS5mnP4urZJa
+                /hmuPjrEta63DjAsIw8wYowc4PoBbj5tKSMfMzrBg6TZ7MFw3IMGgz9xq7UN
+                WhzPcBvvxTy+olVesUJp9FckE/ujL6D8iKS6P3oEZUkCXaf3J2lJRGey0Dg+
+                Na39g1ya9scdKzQ7VsAdfEB5PouvMt5vhC425CdYovULst6lk5lch2physI9
+                kpiW4kMLH2FmHSzELObW0RnK5+MQekOmQhghciG6QnSHuN0w3glhhsiT/h8X
+                5RN2iwcAAA==
+                """,
+        """
+                initial/test/pack/InitialTestPackageKt.class:
+                H4sIAAAAAAAAAJVRXU8TQRQ9M4W2LghtbZUWRJQCbR9cIL5VTQiJcUMFIqQv
+                fXG6Hdppt7tmZ9rgGz/IH2B8MDz7o4x3aFWEGHWSuffcc7/mzv367fMXAM9Q
+                Y9hUoTJKBK6R2rjvhT9wvQlzSsQx2aIrD0wKjCHTF2PhBiLsukftvvSJTTAk
+                o7MzLQ3DRqVxu9heGJmejPcDoXXd86oew3ojirtuX5p2LFSoXRFSjDAqInwY
+                mcNRENSp7HPTU/plGmmG1UFkAhW6/fHQVaGRcUg9vNDElK58nYLDUPB70h9M
+                849FLIaSAhm2Ko2bz65fY05skW692pzHPO46mMMCw3zZ9i7/GGztb3MxsHO6
+                NBv7wLAg2joKRkYeTfPzk3I36WxjOtYbaURHGEF1+HCcoNUwK1JUbmABJ/5c
+                WbRNqLPDcHB5seBcXjg8k3b4End4OlEqZS4vSnyb1fg2301mEhaTnrGanLN/
+                8tmSu4x6onB7808H9NCZ/agjGRbpG+ThaNiW8aloB8TkGpEvgqaIlbWnZPnt
+                KDRqKL1wrLQi6ucy9n4tmsE5iUaxL18pm1Oc5jQnGdcCsQOOGdjDUcQskqTL
+                ZL0mbb/EqeXufMLi8sq7j1cxGySTNEwSWWwSXptEIUM2rlAO98hvUZ4Qxxbh
+                uQRRKUxOEYX/aFP4rc39f2/DUbmS66iSfkGeBzTfUgsJD0UPJZJY9rCChx5W
+                8agFpqnN4xaSGgWNJxpZjZxGXmP2O5cbQQjTAwAA
+                """,
+        """
+                initial/test/pack/OffsetClass.class:
+                H4sIAAAAAAAAAI1QPW8TQRB9u/dhc/nwOYTgfBGgSig4x6IDRSKWIl1kMILI
+                FG5Y25uw8fkOeddR6PxbqGlSRaKILEp+FGL2fFUUoZx082bezLzZmT9/f90A
+                eIXnDNsqVUaJJDJSm+ib6A+j9umplqaZCK1LYAzhubgQUSLSs6jdO5d9U4LD
+                4L+xnQcMzu5eZxEe/AAuSgyu+ao0w07rv8qvSSHLQwZvN473YgZ2Sb/F7wzL
+                oqezZGJkuyiqtoaZSVQavZNGDIQRpMBHFw4twqyhyWxI1KWyUZ28wT7D59l0
+                NeA1HvBwNg142TplQqc2mzZ4nR16v3/4POTHa6Gzwetuww+9An2LxJfu4q18
+                g9FoPIrna57Qlh9oSXEmXw7pvW4zG0iGCp1Bvp+MenJ8InoJMSutrC+Sjhgr
+                Gxdk8CmbjPvySNlg/eMkNWokO0oryr5N08wIo7JUYx+crmw/h2bT0cluUxQR
+                0nPgvbhG+Yocjidk/Zx0sUN2cV6ABwgIq1jIGdt8SNX2aO7m1peft3r9vPfp
+                PF/0Wm8Jy4V2hTxOeuG99IJ76nGqsZ1beEbYpFyV3r7ShRPjYYxVsnR6Mmsx
+                HqPWBdNYx0YXZY1AY1PD1whzZ0mjorHwDymQrhH2AgAA
+                """
+    )
+    // common_typos_enabled
+
+    private val DensityStub: TestFile = compiledStub(
+        filename = "Density.kt",
+        filepath = "androidx/compose/ui/unit",
+        checksum = 0xaa534a7a,
+        """
+            package androidx.compose.ui.unit
+
+            interface Density
+        """,
+        """
+        META-INF/main.kotlin_module:
+        H4sIAAAAAAAAAGNgYGBmYGBgBGJWKM3ApcIlnpiXUpSfmVKhl5yfW5BfnKpX
+        mqmXlp8vxOmWn++SWJLoXaLEoMUAAALEmjo+AAAA
+        """,
+        """
+        androidx/compose/ui/unit/Density.class:
+        H4sIAAAAAAAAAIVOTUvDQBB9s7FNjV+pH1Bv4g9w2+LNkyBCoCIoeMlpm6yy
+        Tbor3U2pt/4uD9KzP0qcqHdn4M17M/DefH69fwC4xDHhTNly4Uy5koWbvzqv
+        ZWNkY02QN9p6E95iECGdqaWStbIv8n4600WIERH6k8qF2lh5p4MqVVBXBDFf
+        RuxNLXQIVPFqZVo1ZFaOCCebdS8RA5GIlNnzYLMeiyG1xzHhfPLfP5wBQvKn
+        LqrA4tE1i0LfmloTTh8aG8xcPxlvprW+ttYFFYyzvssZ2MJvCRz+YB9HPEds
+        2eHu5ogyxBl6jNhuIcmwg90c5LGH/RzC48Aj/QaMxaG1RAEAAA==
+        """
+    )
+
+    override fun getDetector(): Detector = NonLambdaOffsetModifierDetector()
+
+    override fun getIssues(): MutableList<Issue> =
+        mutableListOf(NonLambdaOffsetModifierDetector.UseOfNonLambdaOverload)
+
+    @Test
+    fun lambdaOffset_simpleUsage_shouldNotWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.IntOffset
+
+            val modifier1 = Modifier.offset { IntOffset(0, 0) }
+            val modifier2 = Modifier.absoluteOffset { IntOffset(0, 0) }
+
+            @Composable
+            fun ComposableFunction(modifier: Modifier) {
+                Modifier.offset { IntOffset(0, 0) }
+                Modifier.absoluteOffset { IntOffset(0, 0) }
+                modifier.offset { IntOffset(0, 0) }
+                modifier.absoluteOffset { IntOffset(0, 0) }
+            }
+        """
+            ),
+            Stubs.Composable,
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.IntOffset,
+            OffsetStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun lambdaOffset_withStateUsages_shouldNotWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.IntOffset
+
+            @Composable
+            fun ComposableFunction(modifier: Modifier) {
+                val offsetX = remember { mutableStateOf(0f) }
+                val offsetY = remember { mutableStateOf(0) }
+
+                Modifier.offset { IntOffset(offsetX.value.toInt(), offsetX.value.toInt()) }
+                Modifier.offset { IntOffset(offsetY.value, offsetY.value) }
+                Modifier.offset { IntOffset(offsetY.value, 0) }
+
+                Modifier.absoluteOffset { IntOffset(offsetX.value.toInt(), offsetX.value.toInt()) }
+                Modifier.absoluteOffset { IntOffset(offsetY.value, offsetY.value) }
+                Modifier.absoluteOffset { IntOffset(offsetY.value, 0) }
+
+                modifier.offset { IntOffset(offsetX.value.toInt(), offsetX.value.toInt()) }
+                modifier.offset { IntOffset(offsetY.value, offsetY.value) }
+                modifier.offset { IntOffset(offsetY.value, 0) }
+                modifier.absoluteOffset { IntOffset(offsetX.value.toInt(), offsetX.value.toInt()) }
+                modifier.absoluteOffset { IntOffset(offsetY.value, offsetY.value) }
+                modifier.absoluteOffset { IntOffset(offsetY.value, 0) }
+            }
+        """
+            ),
+            Stubs.Composable,
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.IntOffset,
+            Stubs.SnapshotState,
+            Stubs.Remember,
+            OffsetStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun lambdaOffset_withAnimatableUsage_shouldNotWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.IntOffset
+
+            @Composable
+            fun ComposableFunction(modifier: Modifier) {
+                val offsetX = remember { Animatable(0f) }
+
+                Modifier.offset { IntOffset(offsetX.value.toInt(), offsetX.value.toInt()) }
+                Modifier.offset { IntOffset(offsetX.value.toInt(), 0) }
+
+                Modifier.absoluteOffset {
+                    IntOffset(
+                        offsetX.value.toInt(),
+                        offsetX.value.toInt()
+                    )
+                }
+                Modifier.absoluteOffset { IntOffset(offsetX.value.toInt(), 0) }
+
+                modifier.offset { IntOffset(offsetX.value.toInt(), offsetX.value.toInt()) }
+                modifier.offset { IntOffset(offsetX.value.toInt(), 0) }
+                modifier.absoluteOffset {
+                    IntOffset(
+                        offsetX.value.toInt(),
+                        offsetX.value.toInt()
+                    )
+                }
+                modifier.absoluteOffset { IntOffset(offsetX.value.toInt(), 0) }
+            }
+        """
+            ),
+            Stubs.Composable,
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.IntOffset,
+            Stubs.Animatable,
+            Stubs.Remember,
+            OffsetStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun nonLambdaOffset_usingVariableDp_shouldNotWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Density
+            import androidx.compose.ui.unit.dp
+
+            val offsetX = 0.dp
+            val modifier1 = Modifier.offset(offsetX, 0.dp)
+            val modifier2 = Modifier.absoluteOffset(offsetX, 0.dp)
+            val density = object : Density {
+                override val density: Float
+                    get() = 0f
+                override val fontScale: Float
+                    get() = 0f
+            }
+
+            @Composable
+            fun ComposableFunction(modifier: Modifier) {
+                Modifier.offset(offsetX, 0.dp)
+                modifier.offset(offsetX, 0.dp)
+                Modifier.absoluteOffset(offsetX, 0.dp)
+                Modifier.offset(offsetX, with(density) { 0.dp })
+            }
+        """
+            ),
+            Stubs.Composable,
+            Stubs.Modifier,
+            DensityStub,
+            Stubs.Dp,
+            Stubs.IntOffset,
+            OffsetStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun nonLambdaOffset_usingPassedStaticArguments_shouldNotWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction(passedOffset: Dp) {
+                val yAxis = 10.dp
+
+                Modifier.offset(passedOffset, yAxis)
+                Modifier.absoluteOffset(0.dp, passedOffset)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expectClean()
+    }
+
+    // State tests
+
+    @Test
+    fun nonLambdaOffset_usingStateLocalVariable_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful = remember { mutableStateOf(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(offsetStateful.value, yAxis)
+                Modifier.absoluteOffset(0.dp, offsetStateful.value)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:17: $WarningMessage
+                Modifier.offset(offsetStateful.value, yAxis)
+                         ~~~~~~
+src/test/test.kt:18: $WarningMessage
+                Modifier.absoluteOffset(0.dp, offsetStateful.value)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingDelegatedStateVariable_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.getValue
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful by remember { mutableStateOf(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(offsetStateful, yAxis)
+                Modifier.absoluteOffset(0.dp, offsetStateful)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:18: $WarningMessage
+                Modifier.offset(offsetStateful, yAxis)
+                         ~~~~~~
+src/test/test.kt:19: $WarningMessage
+                Modifier.absoluteOffset(0.dp, offsetStateful)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingStateReceiver_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.State
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunctionWithReceiver(offsetStateful: State<Dp>) {
+                with(offsetStateful) {
+                    val yAxis = 10.dp
+                    Modifier.offset(value, yAxis)
+                    Modifier.absoluteOffset(0.dp, value)
+                }
+            }
+
+            @Composable
+            fun State<Dp>.ComposableFunctionExtensionReceiver() {
+                Modifier.offset(value, 10.dp)
+                Modifier.absoluteOffset(value, 10.dp)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:16: $WarningMessage
+                    Modifier.offset(value, yAxis)
+                             ~~~~~~
+src/test/test.kt:17: $WarningMessage
+                    Modifier.absoluteOffset(0.dp, value)
+                             ~~~~~~~~~~~~~~
+src/test/test.kt:23: $WarningMessage
+                Modifier.offset(value, 10.dp)
+                         ~~~~~~
+src/test/test.kt:24: $WarningMessage
+                Modifier.absoluteOffset(value, 10.dp)
+                         ~~~~~~~~~~~~~~
+0 errors, 4 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingTopLevelStateVariables_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            private val offsetStateful = mutableStateOf(0.dp)
+
+            @Composable
+            fun ComposableFunction() {
+                val yAxis = 10.dp
+                Modifier.offset(offsetStateful.value, yAxis)
+                Modifier.absoluteOffset(offsetStateful.value, yAxis)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:16: $WarningMessage
+                Modifier.offset(offsetStateful.value, yAxis)
+                         ~~~~~~
+src/test/test.kt:17: $WarningMessage
+                Modifier.absoluteOffset(offsetStateful.value, yAxis)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingClassPropertiesState_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            class SecondaryClass {
+                val offsetStateful = mutableStateOf(0.dp)
+            }
+
+            @Composable
+            fun ComposableFunction(secondaryClass: SecondaryClass) {
+                val yAxis = 10.dp
+                Modifier.offset(secondaryClass.offsetStateful.value, yAxis)
+                Modifier.absoluteOffset(secondaryClass.offsetStateful.value, yAxis)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/SecondaryClass.kt:18: $WarningMessage
+                Modifier.offset(secondaryClass.offsetStateful.value, yAxis)
+                         ~~~~~~
+src/test/SecondaryClass.kt:19: $WarningMessage
+                Modifier.absoluteOffset(secondaryClass.offsetStateful.value, yAxis)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingLambdaMethodWithState_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful = remember { mutableStateOf(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(run { offsetStateful.value }, yAxis)
+                Modifier.absoluteOffset(0.dp, run { offsetStateful.value })
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:17: $WarningMessage
+                Modifier.offset(run { offsetStateful.value }, yAxis)
+                         ~~~~~~
+src/test/test.kt:18: $WarningMessage
+                Modifier.absoluteOffset(0.dp, run { offsetStateful.value })
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingStateArgumentsHoisted_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.State
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction(offsetStateful: State<Dp>) {
+                val yAxis = 10.dp
+
+                Modifier.offset(offsetStateful.value, yAxis)
+                Modifier.absoluteOffset(0.dp, offsetStateful.value)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:16: $WarningMessage
+                Modifier.offset(offsetStateful.value, yAxis)
+                         ~~~~~~
+src/test/test.kt:17: $WarningMessage
+                Modifier.absoluteOffset(0.dp, offsetStateful.value)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingStateVariableWithSecondaryMethodCallNoStateInSignature_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.getValue
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful by remember { mutableStateOf(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(anotherTransformation(offsetStateful), yAxis)
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful))
+            }
+
+            fun anotherTransformation(offsetStateful: Dp): Dp {
+                return offsetStateful + 10.dp
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:19: $WarningMessage
+                Modifier.offset(anotherTransformation(offsetStateful), yAxis)
+                         ~~~~~~
+src/test/test.kt:20: $WarningMessage
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful))
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingStateVariableWithSecondaryMethodCallStateInSignature_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.State
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful = remember { mutableStateOf(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(anotherTransformation(offsetStateful), yAxis)
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful))
+            }
+
+            fun anotherTransformation(offsetStateful: State<Dp>): Dp {
+                return offsetStateful.value + 10.dp
+            }
+
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:19: $WarningMessage
+                Modifier.offset(anotherTransformation(offsetStateful), yAxis)
+                         ~~~~~~
+src/test/test.kt:20: $WarningMessage
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful))
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingDelegatedStateVariableWithComplexExpression_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.getValue
+            import androidx.compose.runtime.mutableStateOf
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful by remember { mutableStateOf(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(offsetStateful + 50.dp + yAxis, yAxis)
+                Modifier.absoluteOffset(0.dp, offsetStateful + 100.dp + yAxis)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:18: $WarningMessage
+                Modifier.offset(offsetStateful + 50.dp + yAxis, yAxis)
+                         ~~~~~~
+src/test/test.kt:19: $WarningMessage
+                Modifier.absoluteOffset(0.dp, offsetStateful + 100.dp + yAxis)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    // Animatable tests
+
+    @Test
+    fun nonLambdaOffset_usingAnimatableArgumentsLocalVariable_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetX = remember { Animatable(0.dp, null) }
+                Modifier.offset(x = offsetX.value, 0.dp)
+                Modifier.absoluteOffset(0.dp, y = offsetX.value)
+            }
+        """
+            ),
+            Stubs.Dp,
+            Stubs.Animatable,
+            Stubs.Modifier,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:15: $WarningMessage
+                Modifier.offset(x = offsetX.value, 0.dp)
+                         ~~~~~~
+src/test/test.kt:16: $WarningMessage
+                Modifier.absoluteOffset(0.dp, y = offsetX.value)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingAnimatableArgumentsHoisted_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction(offsetX: Animatable<Dp, Any>) {
+                Modifier.offset(x = offsetX.value, 0.dp)
+                Modifier.absoluteOffset(0.dp, y = offsetX.value)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:14: $WarningMessage
+                Modifier.offset(x = offsetX.value, 0.dp)
+                         ~~~~~~
+src/test/test.kt:15: $WarningMessage
+                Modifier.absoluteOffset(0.dp, y = offsetX.value)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingAnimatableReceiver_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunctionWithReceiver(offsetStateful: Animatable<Dp, Any>) {
+                with(offsetStateful) {
+                    val yAxis = 10.dp
+                    Modifier.offset(value, yAxis)
+                    Modifier.absoluteOffset(0.dp, value)
+                }
+            }
+
+            @Composable
+            fun Animatable<Dp, Any>.ComposableFunctionExtensionReceiver() {
+                Modifier.offset(value, 10.dp)
+                Modifier.absoluteOffset(value, 10.dp)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:16: $WarningMessage
+                    Modifier.offset(value, yAxis)
+                             ~~~~~~
+src/test/test.kt:17: $WarningMessage
+                    Modifier.absoluteOffset(0.dp, value)
+                             ~~~~~~~~~~~~~~
+src/test/test.kt:23: $WarningMessage
+                Modifier.offset(value, 10.dp)
+                         ~~~~~~
+src/test/test.kt:24: $WarningMessage
+                Modifier.absoluteOffset(value, 10.dp)
+                         ~~~~~~~~~~~~~~
+0 errors, 4 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingLambdaMethodWithAnimatable_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful = remember { Animatable<Dp, Any>(0.dp) }
+                val yAxis = 10.dp
+                Modifier.offset(run { offsetStateful.value }, yAxis)
+                Modifier.absoluteOffset(0.dp, run { offsetStateful.value })
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:17: $WarningMessage
+                Modifier.offset(run { offsetStateful.value }, yAxis)
+                         ~~~~~~
+src/test/test.kt:18: $WarningMessage
+                Modifier.absoluteOffset(0.dp, run { offsetStateful.value })
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingTopLevelAnimatableVariables_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            private val animatable = Animatable<Dp, Any>(0.dp)
+
+            @Composable
+            fun ComposableFunction() {
+                val yAxis = 10.dp
+                Modifier.offset(0.dp, animatable.value)
+                Modifier.absoluteOffset(0.dp, animatable.value)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:17: $WarningMessage
+                Modifier.offset(0.dp, animatable.value)
+                         ~~~~~~
+src/test/test.kt:18: $WarningMessage
+                Modifier.absoluteOffset(0.dp, animatable.value)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingClassPropertiesAnimatable_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            class SecondaryClass {
+                val animatable = Animatable<Dp, Any>(0.dp)
+            }
+
+            @Composable
+            fun ComposableFunction(secondaryClass: SecondaryClass) {
+                val yAxis = 10.dp
+                Modifier.offset(0.dp, secondaryClass.animatable.value)
+                Modifier.absoluteOffset(0.dp, secondaryClass.animatable.value)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/SecondaryClass.kt:19: $WarningMessage
+                Modifier.offset(0.dp, secondaryClass.animatable.value)
+                         ~~~~~~
+src/test/SecondaryClass.kt:20: $WarningMessage
+                Modifier.absoluteOffset(0.dp, secondaryClass.animatable.value)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingAnimatableVariableWithComplexExpression_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetX = remember { Animatable(0.dp, null) }
+                Modifier.offset(x = offsetX.value + 2.dp, 0.dp)
+                Modifier.absoluteOffset(0.dp, y = offsetX.value + 5.dp)
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:15: $WarningMessage
+                Modifier.offset(x = offsetX.value + 2.dp, 0.dp)
+                         ~~~~~~
+src/test/test.kt:16: $WarningMessage
+                Modifier.absoluteOffset(0.dp, y = offsetX.value + 5.dp)
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_animatableVariableWithSecondaryMethodCallNoStateInSignature_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful = remember { Animatable<Dp, Any>(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(anotherTransformation(offsetStateful.value), yAxis)
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful.value))
+            }
+
+            fun anotherTransformation(offsetStateful: Dp): Dp {
+                return offsetStateful + 10.dp
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:18: $WarningMessage
+                Modifier.offset(anotherTransformation(offsetStateful.value), yAxis)
+                         ~~~~~~
+src/test/test.kt:19: $WarningMessage
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful.value))
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    @Test
+    fun nonLambdaOffset_usingAnimatableArgumentsWithMethodCallStateInSignature_shouldWarn() {
+        lint().files(
+            kotlin(
+                """
+            package test
+
+            import androidx.compose.animation.core.Animatable
+            import androidx.compose.foundation.layout.absoluteOffset
+            import androidx.compose.foundation.layout.offset
+            import androidx.compose.runtime.Composable
+            import androidx.compose.runtime.remember
+            import androidx.compose.ui.Modifier
+            import androidx.compose.ui.unit.Dp
+            import androidx.compose.ui.unit.dp
+
+            @Composable
+            fun ComposableFunction() {
+                val offsetStateful = remember { Animatable<Dp, Any>(0.dp) }
+                val yAxis = 10.dp
+
+                Modifier.offset(anotherTransformation(offsetStateful), yAxis)
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful))
+            }
+
+            fun anotherTransformation(offsetStateful: Animatable<Dp, Any>): Dp {
+                return offsetStateful.value + 10.dp
+            }
+        """
+            ),
+            Stubs.Modifier,
+            Stubs.Dp,
+            Stubs.Remember,
+            Stubs.Composable,
+            Stubs.SnapshotState,
+            Stubs.Animatable,
+            OffsetStub
+        )
+            .run()
+            .expect(
+                """
+src/test/test.kt:18: $WarningMessage
+                Modifier.offset(anotherTransformation(offsetStateful), yAxis)
+                         ~~~~~~
+src/test/test.kt:19: $WarningMessage
+                Modifier.absoluteOffset(0.dp, anotherTransformation(offsetStateful))
+                         ~~~~~~~~~~~~~~
+0 errors, 2 warnings
+            """
+            )
+    }
+
+    // Non modifier related tests
+
+    @Test
+    fun nonModifierOffset_bytecode_shouldNotWarn() {
+        lint().files(
+            kotlin(
+                """
+                package another.test.pack
+
+                import initial.test.pack.AnotherClass
+                import initial.test.pack.offset
+                import initial.test.pack.OffsetClass
+
+                val offsets = OffsetClass()
+                val otherOffsets = AnotherClass(0)
+                val anotherOffset = offsets.offset(0, 0)
+                val anotherOffsetCalculation = otherOffsets.offset(0, 0)
+
+        """
+            ),
+            AnotherOffsetDefinitionStub.compiled
+        )
+            .run()
+            .expectClean()
+    }
+
+    @Test
+    fun nonModifierOffsetKotlin_shouldNotWarn() {
+        lint().files(
+            kotlin(
+                """
+                package another.test.pack
+
+                import initial.test.pack.AnotherClass
+                import initial.test.pack.offset
+                import initial.test.pack.OffsetClass
+
+                val offsets = OffsetClass()
+                val otherOffsets = AnotherClass(0)
+                val anotherOffset = offsets.offset(0, 0)
+                val anotherOffsetCalculation = otherOffsets.offset(0, 0)
+
+        """
+            ),
+            AnotherOffsetDefinitionStub.kotlin
+        )
+            .run()
+            .expectClean()
+    }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/build.gradle b/compose/foundation/foundation/build.gradle
index c8cca75..e872ef7 100644
--- a/compose/foundation/foundation/build.gradle
+++ b/compose/foundation/foundation/build.gradle
@@ -37,7 +37,7 @@
         api("androidx.annotation:annotation:1.1.0")
         api("androidx.compose.animation:animation:1.1.1")
         api(project(":compose:runtime:runtime"))
-        api("androidx.compose.ui:ui:1.2.0-rc02")
+        api("androidx.compose.ui:ui:1.2.0")
 
         implementation(libs.kotlinStdlibCommon)
         implementation(project(":compose:foundation:foundation-layout"))
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
index 9667156..3e76a2e 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeFontPadding.kt
@@ -41,7 +41,6 @@
 import androidx.compose.ui.draw.clip
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.Placeholder
 import androidx.compose.ui.text.PlaceholderVerticalAlign
 import androidx.compose.ui.text.SpanStyle
@@ -70,7 +69,6 @@
     }
 }
 
-@OptIn(ExperimentalTextApi::class)
 @Composable
 private fun Configuration() {
     val fontSize = 72.sp
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt
index df4275a..085258f 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/text/ComposeLineHeight.kt
@@ -44,7 +44,6 @@
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.PlatformTextStyle
 import androidx.compose.ui.text.SpanStyle
 import androidx.compose.ui.text.TextStyle
@@ -65,7 +64,6 @@
 private val FontSize = 60.sp
 
 @Preview
-@OptIn(ExperimentalTextApi::class)
 @Composable
 fun TextLineHeightDemo() {
     Column(
@@ -173,7 +171,6 @@
     }
 }
 
-@OptIn(ExperimentalTextApi::class)
 @Composable
 private fun LineHeightStyleConfiguration(
     lineHeightStyleEnabled: MutableState<Boolean>,
@@ -195,7 +192,6 @@
     }
 }
 
-@OptIn(ExperimentalTextApi::class)
 @Composable
 private fun LineHeightAlignmentOptions(
     lineHeightAlignment: MutableState<LineHeightStyle.Alignment>,
@@ -236,7 +232,6 @@
     }
 }
 
-@OptIn(ExperimentalTextApi::class)
 @Composable
 private fun LineHeightTrimOptions(
     lineHeightTrim: MutableState<Trim>,
@@ -363,7 +358,6 @@
 }
 
 @Suppress("DEPRECATION")
-@OptIn(ExperimentalTextApi::class)
 @Composable
 private fun TextWithLineHeight(
     lineHeightEnabled: Boolean,
diff --git a/compose/foundation/foundation/samples/build.gradle b/compose/foundation/foundation/samples/build.gradle
index 5a879f3..0a3cad1 100644
--- a/compose/foundation/foundation/samples/build.gradle
+++ b/compose/foundation/foundation/samples/build.gradle
@@ -33,7 +33,7 @@
     implementation(project(":compose:foundation:foundation"))
     implementation(project(":compose:foundation:foundation-layout"))
     implementation("androidx.compose.material:material:1.0.0")
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.compose.ui:ui:1.0.0")
     implementation("androidx.compose.ui:ui-text:1.0.0")
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
index b5b2090..333893c 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
@@ -24,6 +24,7 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.requiredSize
 import androidx.compose.foundation.selection.toggleable
 import androidx.compose.foundation.selection.triStateToggleable
@@ -34,11 +35,14 @@
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import androidx.compose.testutils.first
+import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusManager
 import androidx.compose.ui.focus.FocusRequester
 import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.onKeyEvent
 import androidx.compose.ui.platform.InspectableValue
 import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
@@ -63,15 +67,16 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performKeyInput
 import androidx.compose.ui.test.performMouseInput
 import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.test.pressKey
 import androidx.compose.ui.unit.dp
 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 kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 import org.junit.After
 import org.junit.Before
@@ -94,6 +99,7 @@
     @After
     fun after() {
         isDebugInspectorInfoEnabled = false
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(true)
     }
 
     @Test
@@ -810,4 +816,476 @@
                 click(position = Offset(-1f, -1f))
             }.assertIsOn()
     }
+
+    @Test
+    @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    fun toggleableTest_clickWithEnterKey() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val focusRequester = FocusRequester()
+        var toggled by mutableStateOf(false)
+        rule.setContent {
+            BasicText(
+                "ToggleableText",
+                modifier = Modifier
+                    .testTag("toggleable")
+                    .focusRequester(focusRequester)
+                    .toggleable(value = toggled) { toggled = it }
+            )
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val toggleableNode = rule.onNodeWithTag("toggleable")
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyDown(Key.Enter) }
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyUp(Key.Enter) }
+        rule.runOnIdle { assertThat(toggled).isTrue() }
+    }
+
+    @Test
+    @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    fun toggleableTest_clickWithNumPadEnterKey() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val focusRequester = FocusRequester()
+        var toggled by mutableStateOf(false)
+        rule.setContent {
+            BasicText(
+                "ToggleableText",
+                modifier = Modifier
+                    .testTag("toggleable")
+                    .focusRequester(focusRequester)
+                    .toggleable(value = toggled) { toggled = it }
+            )
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val toggleableNode = rule.onNodeWithTag("toggleable")
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyDown(Key.NumPadEnter) }
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyUp(Key.NumPadEnter) }
+        rule.runOnIdle { assertThat(toggled).isTrue() }
+    }
+
+    @Test
+    @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    fun toggleableTest_clickWithDpadCenter() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val focusRequester = FocusRequester()
+        var toggled by mutableStateOf(false)
+        rule.setContent {
+            BasicText(
+                "ToggleableText",
+                modifier = Modifier
+                    .testTag("toggleable")
+                    .focusRequester(focusRequester)
+                    .toggleable(value = toggled) { toggled = it }
+            )
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val toggleableNode = rule.onNodeWithTag("toggleable")
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyDown(Key.DirectionCenter) }
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyUp(Key.DirectionCenter) }
+        rule.runOnIdle { assertThat(toggled).isTrue() }
+    }
+
+    @Test
+    @OptIn(ExperimentalTestApi::class, ExperimentalComposeUiApi::class)
+    fun toggleableTest_clickWithEnterKey_triStateToggleable() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val focusRequester = FocusRequester()
+        var toggled by mutableStateOf(false)
+        rule.setContent {
+            BasicText(
+                "ToggleableText",
+                modifier = Modifier
+                    .testTag("toggleable")
+                    .focusRequester(focusRequester)
+                    .triStateToggleable(ToggleableState(toggled)) { toggled = !toggled }
+            )
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val toggleableNode = rule.onNodeWithTag("toggleable")
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyDown(Key.Enter) }
+        rule.runOnIdle { assertThat(toggled).isFalse() }
+
+        toggleableNode.performKeyInput { keyUp(Key.Enter) }
+        rule.runOnIdle { assertThat(toggled).isTrue() }
+    }
+
+    @Test
+    @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    fun toggleableTest_enterKey_emitsIndication() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val interactionSource = MutableInteractionSource()
+        val focusRequester = FocusRequester()
+        lateinit var scope: CoroutineScope
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.padding(10.dp)) {
+                BasicText("ToggleableText",
+                    modifier = Modifier
+                        .testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .toggleable(
+                            value = false,
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val interactions = mutableListOf<Interaction>()
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { keyDown(Key.Enter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { keyUp(Key.Enter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions.last()).isInstanceOf(PressInteraction.Release::class.java)
+        }
+    }
+
+    @Test
+    @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    fun toggleableTest_numPadEnterKey_emitsIndication() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val interactionSource = MutableInteractionSource()
+        val focusRequester = FocusRequester()
+        lateinit var scope: CoroutineScope
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.padding(10.dp)) {
+                BasicText("ToggleableText",
+                    modifier = Modifier
+                        .testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .toggleable(
+                            value = false,
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val interactions = mutableListOf<Interaction>()
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { keyDown(Key.NumPadEnter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { keyUp(Key.NumPadEnter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions.last()).isInstanceOf(PressInteraction.Release::class.java)
+        }
+    }
+
+    @Test
+    @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    fun toggleableTest_dpadCenter_emitsIndication() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val interactionSource = MutableInteractionSource()
+        val focusRequester = FocusRequester()
+        lateinit var scope: CoroutineScope
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.padding(10.dp)) {
+                BasicText("ToggleableText",
+                    modifier = Modifier
+                        .testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .toggleable(
+                            value = false,
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+        rule.waitForIdle()
+
+        val interactions = mutableListOf<Interaction>()
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { keyDown(Key.DirectionCenter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { keyUp(Key.DirectionCenter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions.last()).isInstanceOf(PressInteraction.Release::class.java)
+        }
+    }
+
+    @Test
+    @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    fun toggleableTest_otherKey_doesNotEmitIndication() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val interactionSource = MutableInteractionSource()
+        val focusRequester = FocusRequester()
+        lateinit var scope: CoroutineScope
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.padding(10.dp)) {
+                BasicText("ToggleableText",
+                    modifier = Modifier
+                        .testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .toggleable(
+                            value = false,
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val interactions = mutableListOf<Interaction>()
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { pressKey(Key.Spacebar) }
+        rule.runOnIdle {
+            assertThat(interactions).isEmpty()
+        }
+    }
+
+    @Test
+    @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    fun toggleableTest_doubleEnterKey_emitsFurtherInteractions() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val interactionSource = MutableInteractionSource()
+        val focusRequester = FocusRequester()
+        lateinit var scope: CoroutineScope
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.padding(10.dp)) {
+                BasicText("ToggleableText",
+                    modifier = Modifier
+                        .testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .toggleable(
+                            value = false,
+                            interactionSource = interactionSource,
+                            indication = null
+                        ) {}
+                )
+            }
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val interactions = mutableListOf<Interaction>()
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        val toggleableNode = rule.onNodeWithTag("toggleable")
+
+        toggleableNode.performKeyInput { pressKey(Key.Enter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions[0]).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+        }
+
+        toggleableNode.performKeyInput { keyDown(Key.Enter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(3)
+            assertThat(interactions[0]).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat(interactions[2]).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        toggleableNode.performKeyInput { keyUp(Key.Enter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(4)
+            assertThat(interactions[0]).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+            assertThat(interactions[2]).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions[3]).isInstanceOf(PressInteraction.Release::class.java)
+        }
+    }
+
+    @Test
+    @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    fun toggleableTest_repeatKeyEvents_doNotEmitFurtherInteractions() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val interactionSource = MutableInteractionSource()
+        val focusRequester = FocusRequester()
+        lateinit var scope: CoroutineScope
+        var repeatCounter = 0
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.padding(10.dp)) {
+                BasicText("ToggleableText",
+                    modifier = Modifier
+                        .testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .onKeyEvent {
+                            if (it.nativeKeyEvent.repeatCount != 0)
+                                repeatCounter++
+                            false
+                        }
+                        .toggleable(
+                            value = false,
+                            interactionSource = interactionSource,
+                            indication = null,
+                        ) {}
+                )
+            }
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val interactions = mutableListOf<Interaction>()
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput {
+            keyDown(Key.Enter)
+
+            advanceEventTime(500) // First repeat
+            advanceEventTime(50) // Second repeat
+        }
+
+        rule.runOnIdle {
+            // Ensure that expected number of repeats occurred and did not cause press interactions.
+            assertThat(repeatCounter).isEqualTo(2)
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        rule.onNodeWithTag("toggleable").performKeyInput { keyUp(Key.Enter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(2)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(interactions.last()).isInstanceOf(PressInteraction.Release::class.java)
+        }
+    }
+
+    @Test
+    @OptIn(ExperimentalComposeUiApi::class, ExperimentalTestApi::class)
+    fun toggleableTest_interruptedClick_emitsCancelIndication() {
+        InstrumentationRegistry.getInstrumentation().setInTouchMode(false)
+        val interactionSource = MutableInteractionSource()
+        val focusRequester = FocusRequester()
+        val enabled = mutableStateOf(true)
+        lateinit var scope: CoroutineScope
+
+        rule.setContent {
+            scope = rememberCoroutineScope()
+            Box(Modifier.padding(10.dp)) {
+                BasicText("ToggleableText",
+                    modifier = Modifier
+                        .testTag("toggleable")
+                        .focusRequester(focusRequester)
+                        .toggleable(
+                            value = false,
+                            interactionSource = interactionSource,
+                            indication = null,
+                            enabled = enabled.value
+                        ) {}
+                )
+            }
+        }
+
+        rule.runOnIdle { focusRequester.requestFocus() }
+
+        val interactions = mutableListOf<Interaction>()
+        scope.launch {
+            interactionSource.interactions.collect { interactions.add(it) }
+        }
+
+        val toggleableNode = rule.onNodeWithTag("toggleable")
+
+        toggleableNode.performKeyInput { keyDown(Key.Enter) }
+
+        rule.runOnIdle {
+            assertThat(interactions).hasSize(1)
+            assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+        }
+
+        enabled.value = false
+
+        toggleableNode.assertIsNotEnabled()
+
+        rule.runOnIdle {
+            // Filter out focus interactions.
+            val pressInteractions = interactions.filterIsInstance<PressInteraction>()
+            assertThat(pressInteractions).hasSize(2)
+            assertThat(pressInteractions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(pressInteractions.last()).isInstanceOf(PressInteraction.Cancel::class.java)
+        }
+
+        // Key releases should not result in interactions.
+        toggleableNode.performKeyInput { keyUp(Key.Enter) }
+
+        // Make sure nothing has changed.
+        rule.runOnIdle {
+            val pressInteractions = interactions.filterIsInstance<PressInteraction>()
+            assertThat(pressInteractions).hasSize(2)
+            assertThat(pressInteractions.first()).isInstanceOf(PressInteraction.Press::class.java)
+            assertThat(pressInteractions.last()).isInstanceOf(PressInteraction.Cancel::class.java)
+        }
+    }
 }
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionContentChangeTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionContentChangeTest.kt
deleted file mode 100644
index 1bbbfdf..0000000
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/text/CoreTextFieldSelectionContentChangeTest.kt
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * 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.compose.foundation.text
-
-import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.key.KeyEvent
-import androidx.compose.ui.input.key.NativeKeyEvent
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.semantics.SemanticsProperties
-import androidx.compose.ui.semantics.getOrNull
-import androidx.compose.ui.test.ExperimentalTestApi
-import androidx.compose.ui.test.assertTextEquals
-import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.longClick
-import androidx.compose.ui.test.onNodeWithTag
-import androidx.compose.ui.test.performKeyPress
-import androidx.compose.ui.test.performTextInputSelection
-import androidx.compose.ui.test.performTouchInput
-import androidx.compose.ui.text.TextRange
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.LargeTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@OptIn(ExperimentalTestApi::class)
-@LargeTest
-@RunWith(AndroidJUnit4::class)
-class CoreTextFieldSelectionContentChangeTest {
-
-    @get:Rule
-    val rule = createComposeRule()
-
-    private val Tag = "textField"
-
-    private val backspaceKeyDown = KeyEvent(
-        NativeKeyEvent(
-            NativeKeyEvent.ACTION_DOWN,
-            NativeKeyEvent.KEYCODE_DEL
-        )
-    )
-    private val backspaceKeyUp = KeyEvent(
-        NativeKeyEvent(
-            NativeKeyEvent.ACTION_UP,
-            NativeKeyEvent.KEYCODE_DEL
-        )
-    )
-
-    @Test
-    fun whenSelectedTextIsRemoved_SelectionCoerces() {
-        val textFieldValue = mutableStateOf("Hello")
-        rule.setContent {
-            BasicTextField(
-                value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier.testTag(Tag).wrapContentSize()
-            )
-        }
-        val textNode = rule.onNodeWithTag(Tag)
-        textNode.performTouchInput { longClick() }
-        textNode.performTextInputSelection(TextRange(0, 4))
-        textFieldValue.value = ""
-
-        rule.waitForIdle()
-        val expected = TextRange(0, 0)
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
-        assertThat(actual).isEqualTo(expected)
-    }
-
-    @Test
-    fun whenPartiallySelectedTextIsRemoved_SelectionCoercesToEdges() {
-        val textFieldValue = mutableStateOf("Hello World!")
-        rule.setContent {
-            BasicTextField(
-                value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier.testTag(Tag).wrapContentSize()
-            )
-        }
-        val textNode = rule.onNodeWithTag(Tag)
-        textNode.performTouchInput { longClick() }
-        textNode.performTextInputSelection(TextRange(2, 8))
-        textFieldValue.value = "Hello"
-
-        rule.waitForIdle()
-
-        val expected = TextRange(2, 5)
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
-        assertThat(actual).isEqualTo(expected)
-    }
-
-    @Test
-    @FlakyTest(bugId = 238875392)
-    fun whenSelectedTextIsRemoved_addedLater_SelectionRemains() {
-        val textFieldValue = mutableStateOf("Hello")
-        rule.setContent {
-            BasicTextField(
-                value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier.testTag(Tag).wrapContentSize()
-            )
-        }
-        val textNode = rule.onNodeWithTag(Tag)
-        textNode.performTouchInput { longClick() }
-        textNode.performTextInputSelection(TextRange(0, 4))
-
-        textFieldValue.value = ""
-        rule.waitForIdle()
-
-        textNode.assertTextEquals("")
-
-        textFieldValue.value = "Hello"
-        rule.waitForIdle()
-
-        val expected = TextRange(0, 4)
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
-        assertThat(actual).isEqualTo(expected)
-    }
-
-    @Test
-    fun whenSelectedTextIsRemovedByIME_SelectionDoesNotRevert() {
-        // hard to find a descriptive name. Take a look at
-        // `whenSelectedTextIsRemoved_addedLater_SelectionRemains` to understand this case better.
-
-        val textFieldValue = mutableStateOf("Hello")
-        rule.setContent {
-            BasicTextField(
-                value = textFieldValue.value,
-                onValueChange = {
-                    textFieldValue.value = it
-                },
-                modifier = Modifier.testTag(Tag).wrapContentSize()
-            )
-        }
-        val textNode = rule.onNodeWithTag(Tag)
-        textNode.performTouchInput { longClick() }
-        textNode.performTextInputSelection(TextRange(0, 4))
-        textNode.performKeyPress(backspaceKeyDown)
-        textNode.performKeyPress(backspaceKeyUp)
-
-        textFieldValue.value = "Hello"
-
-        rule.waitForIdle()
-
-        val expected = TextRange(0, 0)
-        val actual = textNode.fetchSemanticsNode().config
-            .getOrNull(SemanticsProperties.TextSelectionRange)
-        assertThat(actual).isEqualTo(expected)
-    }
-}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
index 47e4c4b..e5d866d 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldTest.kt
@@ -34,6 +34,7 @@
 import androidx.compose.foundation.layout.requiredHeight
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.wrapContentSize
 import androidx.compose.foundation.text.BasicText
 import androidx.compose.foundation.text.BasicTextField
 import androidx.compose.foundation.text.KeyboardOptions
@@ -58,6 +59,8 @@
 import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.graphics.toPixelMap
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.key.NativeKeyEvent
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalFocusManager
@@ -84,8 +87,10 @@
 import androidx.compose.ui.test.isNotFocused
 import androidx.compose.ui.test.junit4.StateRestorationTester
 import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.longClick
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performKeyPress
 import androidx.compose.ui.test.performTouchInput
 import androidx.compose.ui.test.performSemanticsAction
 import androidx.compose.ui.test.performTextClearance
@@ -994,6 +999,36 @@
         }
     }
 
+    @OptIn(ExperimentalTestApi::class)
+    @Test
+    fun textField_stringOverload_doesNotCallOnValueChange_ifSelectionInherentlyChanges() {
+        var callbackCounter = 0
+        val text = mutableStateOf("ABCDE")
+
+        rule.setContent {
+            BasicTextField(
+                value = text.value,
+                onValueChange = {
+                    callbackCounter += 1
+                    text.value = it
+                },
+                modifier = Modifier.testTag("tag")
+            )
+        }
+
+        rule.onNodeWithTag("tag").performTextInputSelection(TextRange(0, 4))
+        rule.waitForIdle()
+
+        text.value = ""
+        rule.waitForIdle()
+
+        text.value = "ABCDE"
+
+        rule.runOnIdle {
+            assertThat(callbackCounter).isEqualTo(0)
+        }
+    }
+
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
     fun textField_textAlignCenter_defaultWidth() {
@@ -1094,6 +1129,165 @@
         rule.waitForIdle()
         rule.onNodeWithTag(Tag).captureToImage().assertCentered(fontSize)
     }
+
+    @OptIn(ExperimentalTestApi::class)
+    @Test
+    fun whenSelectedTextIsRemoved_SelectionCoerces() {
+        val textFieldValue = mutableStateOf("Hello")
+        rule.setContent {
+            BasicTextField(
+                value = textFieldValue.value,
+                onValueChange = {
+                    textFieldValue.value = it
+                },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
+            )
+        }
+        val textNode = rule.onNodeWithTag(Tag)
+        textNode.performTouchInput { longClick() }
+        textNode.performTextInputSelection(TextRange(0, 4))
+        textFieldValue.value = ""
+
+        rule.waitForIdle()
+        val expected = TextRange(0, 0)
+        val actual = textNode.fetchSemanticsNode().config
+            .getOrNull(SemanticsProperties.TextSelectionRange)
+        assertThat(actual).isEqualTo(expected)
+    }
+
+    @OptIn(ExperimentalTestApi::class)
+    @Test
+    fun whenPartiallySelectedTextIsRemoved_SelectionCoercesToEdges() {
+        val textFieldValue = mutableStateOf("Hello World!")
+        rule.setContent {
+            BasicTextField(
+                value = textFieldValue.value,
+                onValueChange = {
+                    textFieldValue.value = it
+                },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
+            )
+        }
+        val textNode = rule.onNodeWithTag(Tag)
+        textNode.performTouchInput { longClick() }
+        textNode.performTextInputSelection(TextRange(2, 8))
+        textFieldValue.value = "Hello"
+
+        rule.waitForIdle()
+
+        val expected = TextRange(2, 5)
+        val actual = textNode.fetchSemanticsNode().config
+            .getOrNull(SemanticsProperties.TextSelectionRange)
+        assertThat(actual).isEqualTo(expected)
+    }
+
+    @OptIn(ExperimentalTestApi::class)
+    @Test
+    fun whenSelectedTextIsRemoved_addedLater_SelectionDoesNotRemain() {
+        val textFieldValue = mutableStateOf("Hello")
+        rule.setContent {
+            BasicTextField(
+                value = textFieldValue.value,
+                onValueChange = {
+                    textFieldValue.value = it
+                },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
+            )
+        }
+        val textNode = rule.onNodeWithTag(Tag)
+        textNode.performTouchInput { longClick() }
+        textNode.performTextInputSelection(TextRange(0, 4))
+        rule.waitForIdle()
+
+        textFieldValue.value = ""
+        rule.waitForIdle()
+
+        textNode.assertTextEquals("")
+
+        textFieldValue.value = "Hello"
+        rule.waitForIdle()
+
+        val expected = TextRange.Zero
+        val actual = textNode.fetchSemanticsNode().config
+            .getOrNull(SemanticsProperties.TextSelectionRange)
+        assertThat(actual).isEqualTo(expected)
+    }
+
+    @OptIn(ExperimentalTestApi::class)
+    @Test
+    fun whenSelectedTextIsPartiallyRemoved_addedLater_SelectionRemainsPartially() {
+        val textFieldValue = mutableStateOf("Hello")
+        rule.setContent {
+            BasicTextField(
+                value = textFieldValue.value,
+                onValueChange = {
+                    textFieldValue.value = it
+                },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
+            )
+        }
+        val textNode = rule.onNodeWithTag(Tag)
+        textNode.performTouchInput { longClick() }
+        textNode.performTextInputSelection(TextRange(0, 4))
+        rule.waitForIdle()
+
+        textFieldValue.value = "He"
+        rule.waitForIdle()
+
+        textNode.assertTextEquals("He")
+
+        textFieldValue.value = "Hello"
+        rule.waitForIdle()
+
+        val expected = TextRange(0, 2)
+        val actual = textNode.fetchSemanticsNode().config
+            .getOrNull(SemanticsProperties.TextSelectionRange)
+        assertThat(actual).isEqualTo(expected)
+    }
+
+    @OptIn(ExperimentalTestApi::class)
+    @Test
+    fun whenSelectedTextIsRemovedByIME_SelectionDoesNotRevert() {
+        // hard to find a descriptive name. Take a look at
+        // `whenSelectedTextIsRemoved_addedLater_SelectionRemains` to understand this case better.
+
+        val textFieldValue = mutableStateOf("Hello")
+        rule.setContent {
+            BasicTextField(
+                value = textFieldValue.value,
+                onValueChange = {
+                    textFieldValue.value = it
+                },
+                modifier = Modifier.testTag(Tag).wrapContentSize()
+            )
+        }
+        val textNode = rule.onNodeWithTag(Tag)
+        textNode.performTouchInput { longClick() }
+        textNode.performTextInputSelection(TextRange(0, 4))
+        textNode.performKeyPress(
+            KeyEvent(
+                NativeKeyEvent(
+                    NativeKeyEvent.ACTION_DOWN,
+                    NativeKeyEvent.KEYCODE_DEL
+                )
+            )
+        )
+        textNode.performKeyPress(KeyEvent(
+            NativeKeyEvent(
+                NativeKeyEvent.ACTION_UP,
+                NativeKeyEvent.KEYCODE_DEL
+            )
+        ))
+
+        textFieldValue.value = "Hello"
+
+        rule.waitForIdle()
+
+        val expected = TextRange(0, 0)
+        val actual = textNode.fetchSemanticsNode().config
+            .getOrNull(SemanticsProperties.TextSelectionRange)
+        assertThat(actual).isEqualTo(expected)
+    }
 }
 
 private fun SemanticsNodeInteraction.assertEditableTextEquals(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
index c1b74c9..b249514 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
@@ -544,10 +544,9 @@
                 }
             }
             enabled && keyEvent.isClick -> {
-                val press = currentKeyPressInteractions.remove(keyEvent.key)
-                if (press != null) {
+                currentKeyPressInteractions.remove(keyEvent.key)?.let {
                     indicationScope.launch {
-                        interactionSource.emit(PressInteraction.Release(press))
+                        interactionSource.emit(PressInteraction.Release(it))
                     }
                 }
                 onClick()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
index f2b1ad2..843502f 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/DragGestureDetector.kt
@@ -149,10 +149,16 @@
  * Gesture detector that waits for pointer down and touch slop in any direction and then
  * calls [onDrag] for each drag event. It follows the touch slop detection of
  * [awaitTouchSlopOrCancellation] but will consume the position change automatically
- * once the touch slop has been crossed. [onDragStart] will be called when touch slop in passed
- * with the last known pointer position provided. [onDragEnd] is called after all pointers are up
- * and [onDragCancel] is called if another gesture has consumed pointer input, canceling this
- * gesture.
+ * once the touch slop has been crossed.
+ *
+ * [onDragStart] called when the touch slop has been passed and includes an [Offset] representing
+ * the last known pointer position relative to the containing element. The [Offset] can be outside
+ * the actual bounds of the element itself meaning the numbers can be negative or larger than the
+ * element bounds if the touch target is smaller than the
+ * [ViewConfiguration.minimumTouchTargetSize].
+ *
+ * [onDragEnd] is called after all pointers are up and [onDragCancel] is called if another gesture
+ * has consumed pointer input, canceling this gesture.
  *
  * Example Usage:
  * @sample androidx.compose.foundation.samples.DetectDragGesturesSample
@@ -202,10 +208,17 @@
 
 /**
  * Gesture detector that waits for pointer down and long press, after which it calls [onDrag] for
- * each drag event. [onDragStart] will be called when long press in detected with the last known
- * pointer position provided. [onDragEnd] is called after all pointers are up and [onDragCancel] is
- * called if another gesture has consumed pointer input, canceling this gesture. This function
- * will automatically consume all the position change after the long press.
+ * each drag event.
+ *
+ * [onDragStart] called when a long press is detected and includes an [Offset] representing
+ * the last known pointer position relative to the containing element. The [Offset] can be outside
+ * the actual bounds of the element itself meaning the numbers can be negative or larger than the
+ * element bounds if the touch target is smaller than the
+ * [ViewConfiguration.minimumTouchTargetSize].
+ *
+ * [onDragEnd] is called after all pointers are up and [onDragCancel] is called if another gesture
+ * has consumed pointer input, canceling this gesture. This function will automatically consume all
+ * the position change after the long press.
  *
  * Example Usage:
  * @sample androidx.compose.foundation.samples.DetectDragWithLongPressGesturesSample
@@ -354,10 +367,16 @@
  * Gesture detector that waits for pointer down and touch slop in the vertical direction and then
  * calls [onVerticalDrag] for each vertical drag event. It follows the touch slop detection of
  * [awaitVerticalTouchSlopOrCancellation], but will consume the position change automatically
- * once the touch slop has been crossed. [onDragStart] will be called when
- * touch slop in passed with the last known pointer position provided. [onDragEnd] is called
- * after all pointers are up and [onDragCancel] is called if another gesture has consumed pointer
- * input, canceling this gesture.
+ * once the touch slop has been crossed.
+ *
+ * [onDragStart] called when the touch slop has been passed and includes an [Offset] representing
+ * the last known pointer position relative to the containing element. The [Offset] can be outside
+ * the actual bounds of the element itself meaning the numbers can be negative or larger than the
+ * element bounds if the touch target is smaller than the
+ * [ViewConfiguration.minimumTouchTargetSize].
+ *
+ * [onDragEnd] is called after all pointers are up and [onDragCancel] is called if another gesture
+ * has consumed pointer input, canceling this gesture.
  *
  * This gesture detector will coordinate with [detectHorizontalDragGestures] and
  * [awaitHorizontalTouchSlopOrCancellation] to ensure only vertical or horizontal dragging
@@ -498,10 +517,16 @@
  * Gesture detector that waits for pointer down and touch slop in the horizontal direction and
  * then calls [onHorizontalDrag] for each horizontal drag event. It follows the touch slop
  * detection of [awaitHorizontalTouchSlopOrCancellation], but will consume the position change
- * automatically once the touch slop has been crossed. [onDragStart] will be called when touch
- * slop in passed with the last known pointer position provided. [onDragEnd] is called after all
- * pointers are up and [onDragCancel] is called if another gesture has consumed pointer input,
- * canceling this gesture.
+ * automatically once the touch slop has been crossed.
+ *
+ * [onDragStart] called when the touch slop has been passed and includes an [Offset] representing
+ * the last known pointer position relative to the containing element. The [Offset] can be outside
+ * the actual bounds of the element itself meaning the numbers can be negative or larger than the
+ * element bounds if the touch target is smaller than the
+ * [ViewConfiguration.minimumTouchTargetSize].
+ *
+ * [onDragEnd] is called after all pointers are up and [onDragCancel] is called if another gesture
+ * has consumed pointer input, canceling this gesture.
  *
  * This gesture detector will coordinate with [detectVerticalDragGestures] and
  * [awaitVerticalTouchSlopOrCancellation] to ensure only vertical or horizontal dragging is locked,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt
index 6aff0e2..b0158ed 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/TapGestureDetector.kt
@@ -68,16 +68,23 @@
  * The first pointer down and final pointer up are consumed, and in the
  * case of long press, all changes after the long press is detected are consumed.
  *
+ * Each function parameter receives an [Offset] representing the position relative to the containing
+ * element. The [Offset] can be outside the actual bounds of the element itself meaning the numbers
+ * can be negative or larger than the element bounds if the touch target is smaller than the
+ * [ViewConfiguration.minimumTouchTargetSize].
+ *
  * When [onDoubleTap] is provided, the tap gesture is detected only after
  * the [ViewConfiguration.doubleTapMinTimeMillis] has passed and [onDoubleTap] is called if the
  * second tap is started before [ViewConfiguration.doubleTapTimeoutMillis]. If [onDoubleTap] is not
  * provided, then [onTap] is called when the pointer up has been received.
  *
- * If the first down event was consumed, the entire gesture will be skipped, including
- * [onPress]. If the first down event was not consumed, if any other gesture consumes the down or
- * up events, the pointer moves out of the input area, or the position change is consumed,
- * the gestures are considered canceled. [onDoubleTap], [onLongPress], and [onTap] will not be
- * called after a gesture has been canceled.
+ * After the initial [onPress], if the pointer moves out of the input area, the position change
+ * is consumed, or another gesture consumes the down or up events, the gestures are considered
+ * canceled. That means [onDoubleTap], [onLongPress], and [onTap] will not be called after a
+ * gesture has been canceled.
+ *
+ * If the first down event is consumed somewhere else, the entire gesture will be skipped,
+ * including [onPress].
  */
 suspend fun PointerInputScope.detectTapGestures(
     onDoubleTap: ((Offset) -> Unit)? = null,
@@ -196,6 +203,11 @@
 /**
  * Shortcut for cases when we only need to get press/click logic, as for cases without long press
  * and double click we don't require channelling or any other complications.
+ *
+ * Each function parameter receives an [Offset] representing the position relative to the containing
+ * element. The [Offset] can be outside the actual bounds of the element itself meaning the numbers
+ * can be negative or larger than the element bounds if the touch target is smaller than the
+ * [ViewConfiguration.minimumTouchTargetSize].
  */
 internal suspend fun PointerInputScope.detectTapAndPress(
     onPress: suspend PressGestureScope.(Offset) -> Unit = NoPressGesture,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt
index 5545c8e..dff4b42 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/interaction/PressInteraction.kt
@@ -22,6 +22,7 @@
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.ViewConfiguration
 import kotlinx.coroutines.flow.collect
 
 // An interface, not a sealed class, to allow adding new types here in a safe way (and not break
@@ -39,7 +40,9 @@
      * An interaction representing a press event on a component.
      *
      * @property pressPosition the [Offset] describing where this press event occurred within the
-     * component
+     * component. The [Offset] can be outside the actual component bounds meaning the [Offset]
+     * can be negative or larger than the component bounds if the touch target is smaller than
+     * the [ViewConfiguration.minimumTouchTargetSize].
      *
      * @see androidx.compose.foundation.clickable
      * @see Release
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
index 80fcc7e..0c2d5cd 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/selection/Toggleable.kt
@@ -27,12 +27,19 @@
 import androidx.compose.foundation.indication
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.isClick
 import androidx.compose.foundation.isComposeRootInScrollableContainer
+import androidx.compose.foundation.isPress
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.rememberUpdatedState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.composed
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.onKeyEvent
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.modifier.ModifierLocalConsumer
 import androidx.compose.ui.modifier.ModifierLocalReadScope
@@ -45,6 +52,9 @@
 import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.semantics.toggleableState
 import androidx.compose.ui.state.ToggleableState
+import androidx.compose.ui.unit.center
+import androidx.compose.ui.unit.toOffset
+import kotlinx.coroutines.launch
 
 /**
  * Configure component to make it toggleable via input and accessibility events
@@ -245,6 +255,7 @@
     onClick: () -> Unit
 ): Modifier = composed {
     val pressedInteraction = remember { mutableStateOf<PressInteraction.Press?>(null) }
+    val currentKeyPressInteractions = remember { mutableMapOf<Key, PressInteraction.Press>() }
     // TODO(pavlis): Handle multiple states for Semantics
     val semantics = Modifier.semantics(mergeDescendants = true) {
         if (role != null) {
@@ -262,8 +273,7 @@
         PressedInteractionSourceDisposableEffect(
             interactionSource,
             pressedInteraction,
-            // TODO(b/240261333): Replace empty map with map of keys to press interactions.
-            mutableMapOf()
+            currentKeyPressInteractions
         )
     }
     val isRootInScrollableContainer = isComposeRootInScrollableContainer()
@@ -271,7 +281,11 @@
     val delayPressInteraction = rememberUpdatedState {
         isToggleableInScrollableContainer.value || isRootInScrollableContainer()
     }
+    val keyClickOffset = remember { mutableStateOf(Offset.Zero) }
+    val indicationScope = rememberCoroutineScope()
+
     val gestures = Modifier.pointerInput(interactionSource, enabled) {
+        keyClickOffset.value = size.center.toOffset()
         detectTapAndPress(
             onPress = { offset ->
                 if (enabled) {
@@ -286,6 +300,34 @@
             onTap = { if (enabled) onClickState.value.invoke() }
         )
     }
+
+    fun Modifier.detectPressAndClickFromKey() = onKeyEvent { keyEvent ->
+        when {
+            enabled && keyEvent.isPress -> {
+                // If the key already exists in the map, keyEvent is a repeat event.
+                // We ignore it as we only want to emit an interaction for the initial key press.
+                if (!currentKeyPressInteractions.containsKey(keyEvent.key)) {
+                    val press = PressInteraction.Press(keyClickOffset.value)
+                    currentKeyPressInteractions[keyEvent.key] = press
+                    indicationScope.launch { interactionSource.emit(press) }
+                    true
+                } else {
+                    false
+                }
+            }
+            enabled && keyEvent.isClick -> {
+                currentKeyPressInteractions.remove(keyEvent.key)?.let {
+                    indicationScope.launch {
+                        interactionSource.emit(PressInteraction.Release(it))
+                    }
+                }
+                onClick()
+                true
+            }
+            else -> false
+        }
+    }
+
     this
         .then(
             remember {
@@ -300,6 +342,7 @@
             }
         )
         .then(semantics)
+        .detectPressAndClickFromKey()
         .indication(interactionSource, indication)
         .hoverable(enabled = enabled, interactionSource = interactionSource)
         .focusableInNonTouchMode(enabled = enabled, interactionSource = interactionSource)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
index dd92105..5ce4c33 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicTextField.kt
@@ -19,6 +19,7 @@
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
@@ -143,6 +144,13 @@
     // pass `TextFieldValue(text = value)` to the CoreTextField because we need to preserve the
     // composition.
     val textFieldValue = textFieldValueState.copy(text = value)
+
+    SideEffect {
+        if (textFieldValue.selection != textFieldValueState.selection ||
+            textFieldValue.composition != textFieldValueState.composition) {
+            textFieldValueState = textFieldValue
+        }
+    }
     // Last String value that either text field was recomposed with or updated in the onValueChange
     // callback. We keep track of it to prevent calling onValueChange(String) for same String when
     // CoreTextField's onValueChange is called multiple times without recomposition in between.
diff --git a/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt b/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt
index ce22d0d..ed83abb 100644
--- a/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt
+++ b/compose/lint/common-test/src/main/java/androidx/compose/lint/test/Stubs.kt
@@ -457,10 +457,12 @@
     val SnapshotState: TestFile = compiledStub(
         filename = "SnapshotState.kt",
         filepath = "androidx/compose/runtime",
-        checksum = 0xb92981ce,
+        checksum = 0x9907976f,
         source = """
         package androidx.compose.runtime
 
+        import kotlin.reflect.KProperty
+
         interface State<out T> {
             val value: T
         }
@@ -501,14 +503,25 @@
         interface ProduceStateScope<T> : MutableState<T> {
             suspend fun awaitDispose(onDispose: () -> Unit): Nothing
         }
+
+        inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value
+
+        inline operator fun <T> MutableState<T>.setValue(
+            thisObj: Any?,
+            property: KProperty<*>,
+            value: T
+        ) {
+            this.value = value
+        }
         """,
         """
                 META-INF/main.kotlin_module:
-                H4sIAAAAAAAAAGNgYGBmYGBgBGJ2KM3AZc4lkZiXUpSfmVKhl5yfW5BfnKpX
-                VJpXkpmbKsQVlJqbmpuUWuRdIsQfnJdYUJyRXxJckliS6l3CpcYlg0ujXlp+
-                vhBbSGpxiXeJEoMWAwCARLcJeQAAAA==
+                H4sIAAAAAAAAAGNgYGBmYGBgBGJ2KM3Apc8ln5iXUpSfmVKhl5yfW5BfnKqX
+                mJeZm1iSmZ8HFClKFeJxBPMTk3JSvUu4zLkkMDQUleaVZOamCnEFpeam5ial
+                FnmXCPEH5yUWFGfklwSXJJaANCpg0ViaqVeal1kixOJS4F2ixKDFAAA4Rqdc
+                pAAAAA==
                 """,
-        """
+                """
                 androidx/compose/runtime/DerivedState.class:
                 H4sIAAAAAAAAAIVRTW/TQBB9Yzuxk4bghhbSAKVCQk044FJxQKSqhPgQkVIh
                 NVGElNM2XtJtHLvybqIe81s48CM4IKtHfhRinKIKERUuM/Nm37zdffPj57fv
@@ -521,24 +534,24 @@
                 Ukms2XoLBRBcNsDiZXkoMXqYI5QZr6FyjW/B/l3Z2F7mB3jE+Q0zqqxyewi7
                 A7+DdY6o5eFOBxvYHII07uLekLeHusaWRkPjvs5hSWNNo/ILV3pR08ICAAA=
                 """,
-        """
+                """
                 androidx/compose/runtime/DerivedStateImpl.class:
-                H4sIAAAAAAAAAI1R224SURRd58wwTEdKp5RerbdqLVDr1MYH0xKMlzQlQU0K
-                IcY+ncKkPQVmmjkD6SNf4Qf4BZpoTHwwpI9+lHHPQBoVE3mYfZt11tqXHz+/
-                fQfwGFsMeeE1A182L5yG3zn3lesEXS+UHdd56Qay5zaroQjdcue8nQRjqBVr
-                u5Uz0RNOW3gnzpvjM7cR7pXGS5WJeIu12l5pj8H++30SOsP6RBxJGAxGUXoy
-                LDHM58Z7ydcJkCOpKNBy+XoKJq5ZSCDFkOiJdtdlyIy/SyGNmSlw2Ax6eCoV
-                w+Zkc0X7orHMEzesD+mzufy4AKnn8tQXIdUVMlmkeOspzaLFv2YrLT9sS895
-                5YaiKUJBNd7paXRBFpkkA2tR6UJG2TZFzUcM7wb9tMWXuDXox46bhsmXBv2C
-                bg76NtsxM3qGH7Bt/nw6Y9jaCn8y6F9+MLitH66O0reX79NUsi1umyu6mbCN
-                Nd1M2nqksEOiNYaNydYRXbjqiXN16odx4WErZJiqyhNPhN2AhtZf+E1yMxXp
-                ua+7nWM3qInjdnwWvyHadRHIKB8VrarfDRruvoyS5cOhYl0qSX+feZ5PEtL3
-                FLbpdgnQSunj0THJb9CSOJahUWwium6OKiXynLxV+IrpwuYXzH6KcXmyBiGB
-                FApkF4YoZDAHxNHvrBZFWcyPOB3KopeJwmfMfvwnXWoIGNENSRaotnjV2O6o
-                MeO/TRlXTRlY+qMpbRRp2Iz9fTwgv0+IFdK+fgStjNUybpDFzcjcKuM27hyB
-                Kazh7hGmFOYU7imsK6RVlGYV5hUWFWZ+AQql9UpNBAAA
+                H4sIAAAAAAAAAI1R227TQBA9u3Yc16Spm6ZXyq1QmqQUl4oH1EZBXFQ1UgCp
+                iSJEn7aJ1W6T2JXXifqYr+AD+AKQQEg8oKiPfBRi7EQVECTy4Lkcn5kzs/Pj
+                57fvAB5jiyEvvGbgy+aF0/A7575ynaDrhbLjOi/dQPbcZjUUoVvunLeTYAy1
+                Ym23ciZ6wmkL78R5c3zmNsK90jhUmahvsVbbK+0x2H/XJ6EzrE/UIwmDwShK
+                T4Ylhvnc+Cz5OhFyJBUFWi5fT8HENQsJpBgSPdHuugyZ8boU0piZAofNoIen
+                UjFsTrZX9F60lnnihvVh+2wuPy5A6rk8zUVMdcVMFineekq7aPGv2UrLD9vS
+                c165oWiKUBDGOz2NLsgik2RgLYIuZJRtU9R8xPBu0E9bfIlbg37suGmYfGnQ
+                L+jmoG+zHTOjZ/gB2+bPpzOGra3wJ4P+5QeD2/rh6ih9e/k+TZBtcdtc0c2E
+                bazpZtLWI4UdEq0xbEz2HNGFq544V6d+GAMPWyHDVFWeeCLsBrS0/sJvkpup
+                SM993e0cu0FNHLfjs/gN0a6LQEb5CLSqfjdouPsySpYPh4p1qST9feZ5PklI
+                31PYptslQE9KH4+OSX6DHoljGRrFJqLr5ggpkefkrcJXTBc2v2D2U8zLkzWI
+                CaoukF0YspDBHBBHv3e1KMpiftTToSyqTBQ+Y/bjP9ulhoRRu2GTBcIWrwbb
+                HQ1m/Hco42ooA0t/DKWNIg2bsb+PB+T3ibFC2tePoJWxWsYNsrgZmVtl3Mad
+                IzCFNdw9wpTCnMI9hXWFtIrSrMK8wqLCzC+1g+gKTQQAAA==
                 """,
-        """
+                """
                 androidx/compose/runtime/MutableState.class:
                 H4sIAAAAAAAAAIVRwW7TQBB9s3ZiJw3BDS2kAUqFhEg44FJxQKSqhBCISImQ
                 miiqlNM2McGNs66y66hHfwsHPoIDsnrkoxDjFFWIqHCZmbf75s3umx8/v30H
@@ -551,24 +564,24 @@
                 rDRbL1AAwWEDBC/LRYnRwxyhzHgDlWt8C9bvysLuKj/AI85vmVFlldsjWB14
                 HWxyRC0PdzrYwvYIpHEX90a8PdQ1djQaGvd1DksaGxqVX2k2HnjCAgAA
                 """,
-        """
+                """
                 androidx/compose/runtime/MutableStateImpl.class:
-                H4sIAAAAAAAAAI1RXU8TQRQ9M7vdLrWUpZRPURRF2iIuEh8MNDVqQmxSNKFN
-                Y+RpaDcw0O6SzpTw2F/hD/AXaKIx8cE0PPqjjHfahqg1sQ97P86ee8+9c3/8
-                /PYdwBNsMuRE2GhHsnHp16PWeaQCv90JtWwF/n5Hi6NmUNFCB6XWeTMOxlAt
-                VHfKp+JC+E0RHvtvjk6Dut4tjkLlsfoWqtXd4i6D93d9HDbD2lg94nAYnIIM
-                pS4yzGZHZ8nViJAlKRNY2VwtCRc3EoghyRC7EM1OwJAerUsihakJcHgMtj6R
-                imFjvL3Me9Fa7nGga4P2mWxuVIDUszmai5jqmhkvULz5jHax+r+my2eRbsrQ
-                3w+0aAgtCOOtC4suyIyJM7Azgi6lybYoajxmeNfrphJ8gSd63b7jruPyhV43
-                b7u9rse23bSd5q/YFn8xmXY8a4k/7XWvPjjcsw+Wh+nbq/cpgrwE99wl2415
-                zqrtxj3bKGyTaJVhfbznMBeuhOJcnUS6Dzw60wwTFXkcCt1p09L2y6hBbqos
-                w+B1p3UUtKum2pwlqotmTbSlyYdgohJ12vVgT5pk8WCgWJNK0t/nYRiRhIxC
-                hS26XQz0pPRxc0zy6/RIHIuwKHZhrpslpEiek0/kv2Iyv/EF05/6vBxZh5hA
-                BnmycwMW0pgB+tHvXRMUZTA77OlTZipj+c+Y/vjPdskBYdhu0GSOsPnrwXaG
-                gzn/Hcq5HsrBwh9DWcPIwkbfP8BD8nvEWCLtm4ewSlgu4RZZ3DZmpYQ7uHsI
-                prCKe4eYUJhRuK+wppBSJs0ozCrMK0z9AszbTrVNBAAA
+                H4sIAAAAAAAAAI1RXU8TQRQ9M7vdLrWUpXwjfqFIW8RF4oOBpkZNjE2KJrRp
+                jDwN7QYG2l3SmRIe+yv8Af4CTTQmPpiGR3+U8c62IWpN7MPej7Pn3nPv3B8/
+                v30H8BibDHkRNjuRbF74jah9FqnA73RDLduBv9fV4rAVVLXQQbl91kqCMdSK
+                tZ3KiTgXfkuER/6bw5OgoXdLo1BlrL7FWm23tMvg/V2fhM2wNlaPJBwGpyhD
+                qUsMc7nRWfJ1IuRIygRWLl9Pw8W1FBJIMyTORasbMGRH69LIYGoCHB6DrY+l
+                YtgYby/zXrSWexTo+qD9bC4/KkDquTzNRUx1xUwWKd58SrtY8a/pymmkWzL0
+                9wItmkILwnj73KILMmOSDOyUoAtpsi2Kmo8Y3vV7mRRf5Kl+L3bcdVy+2O8V
+                bLff89i2m7Wz/BXb4s8ns45nLfMn/d7lB4d79v7KMH17+T5DkJfinrtsuwnP
+                WbXdpGcbhW0SrTGsj/cc5sLVUJyp40jHwMNTzTBRlUeh0N0OLW2/iJrkpioy
+                DF5324dBp2aqzVmihmjVRUeafAimqlG30wheSpMs7Q8U61JJ+vssDCOSkFGo
+                sEW3S4CelD5ujkl+nR6JYwkWxS7MdXOElMhz8qnCV0wWNr5g+lPMy5N1iAnM
+                oxDbmIUsZoA4+r1riqJZzA17+pSZykThM6Y//rNdekAYths0mSds4WqwneFg
+                zn+Hcq6GcrD4x1DWMLKwEfv7eED+JTGWSfv6AawyVsq4QRY3jblVxm3cOQBT
+                WMXdA0wozCjcU1hTyCiTzirMKSwoTP0Cc/1T9U0EAAA=
                 """,
-        """
+                """
                 androidx/compose/runtime/ProduceStateScope.class:
                 H4sIAAAAAAAAAI1T328SQRCeXSh3INUr/gJarVqNSox3Ep+EEI2GFEO1EfSF
                 p+U4cOHYJbd72Efin+KDf4PxwRB8848yzkFpY7G2DzezM/PNN/vju1+/v/8A
@@ -584,82 +597,90 @@
                 opCCbfQJrF5Afwu/dYpBOoLO7RIYg9tzfwPuoK9idR1JL7YgVoNLNbDQwkZk
                 MjW4DFdaQBRchWstSCq4riCrIKfAVJBXsKlga75I/gEnsHRUOwQAAA==
                 """,
-        """
+                """
                 androidx/compose/runtime/SnapshotStateKt$produceState$1.class:
-                H4sIAAAAAAAAAI1T3U4TURD+znb7w7rQUgEBFVGLbouyQEzUFEgMkaSxakJJ
-                Y8LVsruUA+1Zsnu24bJP4QP4BJpoTLwwDZc+lHHOtjEoCF7s/GXmm2/OzP74
-                +e07gCdYZXjqCC8MuHdiu0HnOIh8O4yF5B3fbgjnODoIZEM60n8lS8dh4MWu
-                n7illSwYFdcPna5jtx3Rst/uHfqurNb/jacK13Z2qhtVhsLfhVnoDHOXF2eR
-                YcisccHlBsOkdb57uUkJFvVQRsoqN03kcM1AGiZDuuu0Y5+heL7OxBjyI9BQ
-                YNDlAY8Ynl8yyaUvQ9ONlhRH7rSbg465li+H5oRVPt+euFllYk2cEzlePwpk
-                mwv7tS8dz5EOxbRON0VLY0pkGdgRhU648pbJ8lYY1vu9UaPfM7RpzdByeoX1
-                ezljut9bzRX1ovas31tm21MFbVaZ707f66cfMoahFdKzei5V0BUI3cP8FQsk
-                Jtb/PkwWJQbz7Osw7F+wtQsiw/kPux17Pxau5IGI7K2htVotX8XSxAM8pDP7
-                g9HSkWQYafCWcGQcEhl9M/BI5etc+G/izp4f7jh77eREAldtL+TKHwbNmhB+
-                uNl2osinA8m/FG47iLho0ZYOAo/BaARx6PpbXGXPbA8INXnEqfyFEAFxUHNg
-                hQ4tDQb6h1BUl0e6QovUME0f6GTVKS6StUVaRYzKV4xWFr9g/FOS94jkGNTy
-                S9CxQPklPCZvapBNqNeBxJo4g26QNZnkKGybPEY6XfmM8Y+/YTNJcCGBMwcJ
-                Q7gByA3ylxJoljQDZggKCQ1rmJPCcqLLNCqwTpkzVDW7i1QNN2u4RRK3lZir
-                4Q7md8Ei3MW9XWQiZd6PMBZhMsJUhPwvI18g0K0EAAA=
+                H4sIAAAAAAAAAI1T3U4TURD+znb7w1poqYCAf6gVtkVZICZqCiSGSNJYNaGk
+                MeFq2V3Kge1Zsnu24bJP4QP4BJpoTLwwDZc+lHHOtjEoCF7s/GXmm2/OzP74
+                +e07gCdYZXhqCzcMuHtiOUHnOIg8K4yF5B3Pagr7ODoIZFPa0nsly8dh4MaO
+                l7jllSwYFTcO7a5t+bZoW2/3Dj1H1hr/xlOFazs7tY0aQ/Hvwix0hjuXF2eR
+                YcisccHlBsOkeb57pUUJJvVQRsqstPLI4ZqBNPIM6a7txx5D6XxdHmMojEBD
+                kUGXBzxieH7JJJe+DE03WlYcue23Bh1zbU8OzQmzcr49cTMrxJo4J3K8cRRI
+                nwvrtSdt15Y2xbRON0VLY0pkGdgRhU648pbJclcY1vu9UaPfM7RpzdByepX1
+                ezljut9bzZX0kvas31tm21NFbVaZ707f66cfMoahFdOzei5V1BUI3cPcFQsk
+                Jub/PkwWZYb82ddh2L9gaxdEhvMfdjvWfiwcyQMRWVtDa7VWuYplHvNYoDP7
+                g9HSkWQYafK2sGUcEhl9M3BJFRpceG/izp4X7th7fnIigaO2F3LlD4P5uhBe
+                uOnbUeTRgRReCscPIi7atKWDwGUwmkEcOt4WV9kz2wNCLR5xKn8hREAc1BxY
+                oUNLg4H+IZTU5ZGu0iI1TNMHOll1iotkbZFWEaP6FaPVxS8Y/5TkPSI5BrX8
+                eehYoPx5PCZvapBNqNeBxJo4g26QNZnkKGyLPEY6Xf2M8Y+/YTNJcCGByw8S
+                hnADkBvkLyXQLGkGzBAUiMZDmMOcFJYTXaFRgXXKnKGq2V2k6rhZxy2SuK3E
+                nTruYm4XLMI93N9FJlLmgwhjESYjTEUo/AJAwj8ArQQAAA==
                 """,
-        """
+                """
                 androidx/compose/runtime/SnapshotStateKt.class:
-                H4sIAAAAAAAAAKVWa1PbRhQ9KxvLKASEedq0hCakvLGhebSxS5tCHi7Pxo5b
-                StNU2IIIbInRykzyjelP6S/ot2TKTMeTfutP6Y/o9K4sgzDYmNQz+z737N6r
-                u2f9979//AngDn5hGNfMgm0ZhdfxvFU6sLget8umY5T0eMbUDvgry8k4mqMv
-                OzIYg7qnHWrxombuxte39/Q8zQYYOgu6bRzqBRe5vsOQHF+pByYnVhrutOQz
-                TzI8SWUfnLdfGM9mWyVJEXSBmG6tWPZufE93tm3NMHlcM02L1g2L+muWs1Yu
-                Fgk10RJnunRQlNHOEEoZpuEsMPRd5GWuA9fQoUDBdYbbLTHL6GJoO9SKZZ0h
-                cp6TAlwqO9p2Uf/QAK/6zD84wH6SWoAbh86ProauX8FA86D4bWREKRh+v1cM
-                7gjfZ8ebHPJM0goLOmS6gbtXoak5PNm6iYxhhsB4NSNGFNzAJwzdfo9WtQPh
-                0EzLJyEDOsPL1PIF/uT+l4/EnMouJ7O5Sz5rvZGMTxWMCc86DmyrUM5XPWPY
-                uSBDL5jZt5yiYcb3DkvxnbKZr17Nx15vvlk61pL5n8bJfOX9UjON99vwuZfJ
-                WwfeHZipUeYt2yo7hqnz+KJFJmbZFZrUCeA5qQYZTF1w2Ev9rKXf7ca4RXcs
-                cotwo82Ej1TPg4W9b2aHMcsw7AuOYTq6bWrFeNp0bGIw8lxGgjQv/0rP73va
-                uaHZWkknIMNY88+dESS7rjrO4zMFc7jDcL/Vp2fUn1qjczLuKbgvpGS4edRk
-                fEF5KdTa0Iq5qr4G9/U3cwwjl2UeXdUaZFV3tILmaDQnlQ4D9HIyUckMbF90
-                JJp/bYgeBUgqzDF2t3K0pFSOFGlQUqRw0G1PhgGvlU5blRZr67WiSp5Z7AYt
-                x8KRYER6KiXYzWC4cqRK8yE1EKOJ97+FJDUYi6htJ5CQB4kNq3Ks051sd2sl
-                Ea4utVPDVIWYr51YdVxEfD32Qu08gXSdQlQBmQ+r3bHgIEtE5mfUnthEmEWU
-                SA3cV+snBhL9kVDExSV6BW148Kn81ztWOXL3iL7/VaIQhaMiePOUSi3/UWBZ
-                humrvQVTV1Jatkwl1/RIdU/ryOWCBfHIe6nlz7cmnpzTnqQvgxsID0GGa5BH
-                rx2d7rBl1vbLvnE51DM+z+47dD8WrQJdk64VIlwrl7Z1Oyv8E2e28uIW2YYY
-                e5PtGWPX1JyyTf2hZ9XTps1Dgxu0/PBUdEiR6ldPxOMMrCNtmrq9WNQ412mo
-                ZKyyndcfG2KzqEeRO0dPeiIhCPFrQ5RKCAF8T6N71FLE0XEMZXPyLTorUH8X
-                VxY/UB1y1zqxKRBVHLoRofZHFyNjy0OFqY2iB73neQcE72AFsXre/oa8fXW8
-                Q/jI4x2hVfELH+PG5lvcFJzMxznoMXxcx3ALo+cZxohhvJ5hyGO4XccwgUmK
-                oGDYICYhZpHpSPwd7h7jvvDw8woenPUwRHtuuju6aCRdD0UvRYW5vVl8SRbV
-                HafcHRXqTYvzUfmJSperp5hxazEZwAsXRu+DSxfFz655Di+pfUPzC/SBv9pC
-                II2v03hINb5JYxFLaTzC4y0wjid4uoUYRxtHmuNbjm6OEMcQxzLHLY4VjlWO
-                NY4ejnWOXo4Jjg2OJEeK4zuOWY5nHBmOrDt8zjH5HwVy1ew1DQAA
+                H4sIAAAAAAAAAKVYW1PbVhD+jm1sIxwQBgKIBEjiBDAXG5ombXBJU3LB5drg
+                0KY0TYQtQGBLro5MkzemD33sj+gvaJ+SNDMdJn3rT+mP6HSPLBvb2AZSz0jn
+                tvudb/fs2dX473//+BPATRwwjKpGxjL1zMtY2szlTa7FrIJh6zkttm6oeb5r
+                2uu2amuLdgCMQd5TD9RYVjV2Yqtbe1qaZr0M7RnN0g+0jCO5us0wO7pUKzg7
+                ttRwp/sV6rMMjxKpOyf150ZTqbOCJEh0jpCuLZnWTmxPs7csVTd4TDUMk9Z1
+                k/orpr1SyGZJauxMmMlcPhtAK4M/oRu6PcfQU8/KjRDaEJIg4QLD9TMhB9DB
+                0HKgZgsaQ/gkJjk4V7DVraz2oQ5erlD/YAdXgpQc3Nh1ldJF112U0NvcKZU6
+                AfSTMyrtXtK5LWyfGm1CsipohQaRTDYw9zwwJYOjZ1cJYJDBO1qMiGEJQ7jC
+                0Flp0bKaFwZNnpkJKRCH54nFOvZs/C8bCTmRWpxNbZxyrLVKAdyQMCIsC+Ut
+                M1NIFy1j2K4ToXVm9k07qxuxvYNcbLtgpItX86Hbm2kWjqVg/qdxMJ97v8Rk
+                4/3WKsxbT5t59w5MliDTpmUWbN3QeGzeJBWj4CSaRFngCWUNUhivQ/ZUO0vh
+                d72x3LwzFrFFcpFmiY+ynisWdM/MCmKKYbDCObpha5ahZmNJw7YIQU/zAOKU
+                89K7WnrfzZ1rqqXmNBJkGGl+3OsCZMfJjjP4SMI0bjLcPmvpiVSGVmQ6gFsS
+                botUMtjcawF8SnEpsrWuZjeK+dW3r72aZhg+LfLIOTua7Sq9GD0tDhuHmqVt
+                Z2kcW6QAymuW/YoOu06KzzcI49MCY9yJjHNsn4hSuJGSKGT2rs7ngrhXjARn
+                OYh5hu7ROhxDmMODNtzBQ4YLET2yHTl2EEtSkYoIuIrJ4dMvb0CoED6D0thf
+                xI6XQXebeKSqzJ3nROrVcYYfz30kJ0vkOQ9GVGC6IysItUHBVyVHH5vvOvl4
+                YuTMVb+ztPOyZqsZ1VZpzpM78NKXIBOvAB3jvuh4aP6lLnp04T2ZacbeHB2u
+                SEeHkqfPI3mCPqctD71u6zluZVosrZce2VOlTnrKEMkpwbAv7FnwxNlVX/Do
+                UPbM+GWvQhPvf/V7ZJ8SllvKIn5XRBmUA0q7M9nqvKV4sLjUSg2TJUJuK2uF
+                6gFfUJ7J7WWRjmMRWYjMBOVOxdfH4uGZSblLGQuysBQuCfeU+vHe+MWwP+zI
+                xbsFbLBvIfDXG3Z06OzRr9yUFQHnokfL2xH+gIsvyZcUf5i8Eb+88P5nyVEc
+                VBLykEL4tYqh+ooly8oAw+9/8pCbg/3i/GaaBknNtzdLMUyc7/Nq/FwfL2yR
+                HrpcEJ+6bkBWZt0mm5+owLMVebxB+SWRwZLIg5e2RpXMNEr7pV45GHIVzal9
+                m6rEvJmhy9WxRIArhdyWZqXEVRKczbSoJZYuxu5k67q+Y6h2waL+wOMi26Rx
+                oHOdlu8dl16qy7Wr5RJaJRZKGoZmzWdVzjUaSutmwUprD3WxWb8LsXECnqqq
+                Bz6IH309owV+eJGj0S1qyeMIvYP0NPoa7UeQfxMXHQa9/c6aDFNIFOXQiTC1
+                eUcmgB9cqSC1/ehC90ncXoHbdwSlFrevIW5PDe4ALrm4w7QqfsF3GHr6GlcF
+                JqvAVFyEyzUI1xA5iTBCCKO1CJddhOs1CGOIkgcFwhohiRQYngjH3uDjd7gt
+                LPzkCHeqLfTjhmPhcFEas46Fopeghzm9KXxGGsUdx50dJepNCH70WPR0OFkY
+                k867SGUOd11jnrnH2hMNf0FUJsL36e2di77FI4ZqNu2IOWyEFe10cgtIOrx6
+                8CUWHV49WHJ59WAey2Venzs8urzu/tVcVrDqcsmRaAu1vVVcbvmik2/x2IPf
+                y2yEhR0UIRfpS810/mxooXEQ68RIGNOLFJ44jHrLjHpdRqInIsXrcltzuPX4
+                6nADCXFnO/qedMb9sB2lLArU/kLzG7T115vwJvFNEk/pjW+T2MR3SfLs95tg
+                HM/xYhNXOFo4VI4tjk4OP8cAR5rjGkeGQ+PY5ujieMLRzTHGscgxy5Hg2OGY
+                4tjl0Dn2nOE+R5RjjmOJY55jmeMuxwrH6n8UZ3xFehEAAA==
                 """,
-        """
+                """
                 androidx/compose/runtime/SnapshotStateList.class:
-                H4sIAAAAAAAAAI1QTUsjQRB93ZNkdIzr+LmJ6+5e3SCOiiCoCO6CEBhd2IRc
-                cupkGm2TdMt0RzzOb/EfeBI8yODRHyXWxL3oXrYPr6peP6pe1fPLwyOAXXxn
-                aAidpEYlN1HfjK6MlVE61k6NZNTS4speGNdywslYWeeDMawftvfjS3EtoqHQ
-                59Hv3qXsu4OjfymG8CPno8RQOVRauSMGb/1Hp4oK/ABlTDGU3IWyDBvx/zui
-                IfPxwLih0tGpdCIRThDHR9ce7ccK8BnYgKgbVVRblCXbtEWeVQNe40GeBTwk
-                yLNanjVKU3kWsh2+xX+Wn24rPPQK/Q61aDPqh/Cdg82BI9e/TCIZ5mKl5dl4
-                1JNpW/SGxCzEpi+GHZGqov5LTrfUuRZunFIetMw47csTVXzU/7zt2FFWkfJY
-                a0MjlNEW2+B0oOKRj+JehHWqokkNlBv3mL6jhGOVsDIh6/hCWH0TIMAMRQ9r
-                E5WHr5NYwzeKe6Spkma2C6+JT03MESIsYL6JBSx2wSyWsNxFyWLGYsXis4X/
-                Crt4fDJFAgAA
+                H4sIAAAAAAAAAI1QXUsbQRQ9M5tkdY26ftTGj9pXG8Q1UhCsCFYoBLYWmpCX
+                PE2yg45JZmRnInnc3+I/6FOhD7L46I8S70ZftC/OwLn3nDncj3l4/HcH4Cs+
+                M9SFTlKjkknUN6NrY2WUjrVTIxm1tLi2l8a1nHAyVtb5YAw7x+2j+ErciGgo
+                9EX0q3cl++7byf8SQ/hW81FiqBwrrdwJg7fzpVNFBX6AMmYYSu5SWYbd+P0T
+                UZOleGDcUOnop3QiEU6Qxkc3Hu3HCvAZ2ICkiSrYPmVJg7bIs2rAazzIs4CH
+                BHlWy7N6aSbPQnbA9/n38v1thYde4T+gEm1G9RC+mmBv4GjqM5NIhsVYaXk+
+                HvVk2ha9ISnLsemLYUekquAv4mxLXWjhxinlQcuM0778oYqH9d/PO3aUVeQ8
+                1dpQC2W0RQOcPqg4NEfxX4TrxKIpB8r1v5j9QwnHBmFlKm7SBarPBgSYo+hh
+                a+ry8Gkaa9imeEieKnnmu/CaWGhikRBhAUtNLGOlC2axig9dlCzmLNYsPlr4
+                TxVS9+dFAgAA
                 """,
-        """
+                """
                 androidx/compose/runtime/SnapshotStateMap.class:
-                H4sIAAAAAAAAAI1QTW8TMRB9402y6Ta025aPlK9ypEVi24pTiSoBElLULUgE
-                7SUnJ2u1bhI7WjtVj/tb+g84IXFAK478KMRsyoWPA7b8Zub5eWY83398+Qrg
-                BZ4QdqXJC6vzq2RsZ3PrVFIsjNczlQyMnLtz6wdeenUq5yGI0OudHKUX8lIm
-                U2nOkvejCzX2L7N/cMd/U4T4Ty5Eg9DqaaP9MSF4upt10EIYoYk2oeHPtSM8
-                S/+7Sa6xkU6sn2qTnCovc+klc2J2GfCPqYaQQBOmrnQd7bOXHxCSqlyLRFdE
-                os0nrsqoKrtVuddoV2VMbCgWh2I/eN38dt0ScaN+dsiZTvhkxKkR/9bL84nn
-                /t/YXBHWU23Uu8VspIqPcjRlZjO1YznNZKHr+Be5MtBnRvpFwX40sItirN7q
-                +mL7w81vM+00K18ZY7mEtsbhAIJHVS/uo54c432OkmUMNPc+Y+UTOwIPGFtL
-                8iFvoHMjQIRVtgEeLVUBHi/tNnbYHrGmw5pbQwR9rPWxzoi4ho0+NrE1BDnc
-                xp0hmg6rDncd7jl0HcKfilH6lmUCAAA=
+                H4sIAAAAAAAAAI1QTU8bMRB99ibZsKSwQKGBftBjoVIXUE80QqKVkCKWVmqq
+                veTkZC0wSexo7SCO+1v4Bz1V6qFa9ciPqjoOvbTlgCW/N/P8bM/M7a/vPwC8
+                xUuGHaHzwqj8OhmaydRYmRQz7dREJj0tpvbCuJ4TTp6JaQjG0OmcHqaX4kok
+                Y6HPk0+DSzl077J7tKP/JYb4Xy1EjaHRUVq5I4bg1U7WQgNhhDqaDDV3oSzD
+                6/TBRdIfK+nIuLHSyZl0IhdOkMYnVwF1zDyEDGxE0rXy2R5F+T5DUpVLEW/z
+                iDdpx1UZVWW7KndrzaqMGRGL+QHfC97Xf940eFzz1w7opVPaGaOnEf9Vy5uR
+                o/o/mFwyLKdKy4+zyUAWX8RgTMpqaoZinIlC+fyPuNBT51q4WUFx1DOzYihP
+                lD/Y/HzXbaasIuex1oa+UEZb7IPTqPyiOvzkCLcoS+Y5UN/9hoWvFHA8JWzM
+                xRd4Rti6MyDCInGA53NXQKeeN7FNfEieFnke9RF0sdTFMiFiDytdrGKtD2bx
+                GOt91C0WLTYsnli0LcLftbcdUGUCAAA=
                 """,
-        """
+                """
                 androidx/compose/runtime/State.class:
                 H4sIAAAAAAAAAH1QTUvDQBB9k7RpjF/xu1YQj9WDUfEgfoEXoVARbBGhp7Vd
                 69p0I91t8Zjf4sEf4UGCR3+UOFFPKu7hzbw3O7Nv5+39+QXALlYIq0J3Bonq
@@ -672,6 +693,174 @@
                 waLJaekDuDg1Tf4BAAA=
                 """
     )
+
+    val Dp: TestFile = compiledStub(
+        filename = "Dp.kt",
+        filepath = "androidx/compose/ui/unit",
+        checksum = 0x9e27930c,
+        """
+            package androidx.compose.ui.unit
+
+            @kotlin.jvm.JvmInline
+            value class Dp(val value: Float) : Comparable<Dp> {
+                override operator fun compareTo(other: Dp) = value.compareTo(other.value)
+            }
+
+            inline val Int.dp: Dp get() = Dp(value = this.toFloat())
+        """,
+        """
+                META-INF/main.kotlin_module:
+                H4sIAAAAAAAAAGNgYGBmYGBgBGJ2KM3ApcAlkZiXUpSfmVKhl5yfW5BfnKpX
+                mqlXmpdZIsTiUuBdosSgxQAA2sByTDoAAAA=
+                """,
+        """
+                androidx/compose/ui/unit/Dp.class:
+                H4sIAAAAAAAAAH1V3VMbVRT/3c3XZlnKkrZA6KektgGkCVihSsG2UFoQWi2I
+                /dDWJdnCQrKbZjdMxyfGF/0L+uCbPnc6OqOUsTMO0jf/IJ8cx3M2NyENkZnk
+                fpx7Pn7nd869+9e/v/8B4BI2BU6YTr7s2vlnmZxbLLmelanYmYpj+5npUgxC
+                4Ob8urlpZgqms5q5s7Ju5fzxBskUGZllc6VgXZk/xNP45LiA0ewohrDAsVbO
+                YogKqKuWv2wWKpZAKN0/IxDZrO7EjA4NbXEo0AXC/prtCZw6NL5AZy7wbi25
+                Q9nRy9n1x5fIYXpmpn9WoGMfw0zBNQlYQiAmDXQcQ6eGozhOsczyapbsXH/N
+                KtM2TeY6DD5X0CvQ7ruLftl2VofsYqkgcJwUGtiqnhGY7mbZ9YpdyFvlGE4L
+                RK/YhHoyyHpZx1m8o+EM+gTi06V0QMGEinOkZ5ZKlpMXGEofjHEwrAwxruM8
+                LrDHtMDJVvgaFQdYcZAVpw5XHGLFi1S0GgNU2XSL3HVkMcy6IzpO4hTzRoVo
+                XzO9tSk3b0ne1NpexxiSTP7lgA4ie5T3CojENutpxSx40qQrPXOwU/sfCGgV
+                Z8V9Fmjp+Bhxtr5K5Q2YvPOEcb5FQtABhPM6pjjwtMDpDdcv2E5mfbOYsR3f
+                KjtmITPrcEKenfNioN5UqVNuMB6BC+lDr0wdmo5bmNVwE3MCiYMKVOBqgtxG
+                re0nMMnZ3Kl24rKGCLeJkXMdzy9Xcr5bluTwMYOsESFwlpM+7MZw433G3r+g
+                C0cPhd7AdlZeHWJXKQ3zMELdWb9g/wM4uClB8b6mcs03kDq3WZx1aGPxPa0d
+                LFi+mTd9k2RKcTNED5bgIUZwNkj0zOYdIVHyhODv3a2LmtKjaIrRoe1u0RTT
+                FDVCs0pzmOY2+vOBGqXFEZoVde+7qz27WyNqIpxQsrtbWXE9kYgaSq+SDb3Z
+                Ebtbez9Fw2rYiMydNlQSxkeihtbLmrf2niukIfa12gx9rtdop9MjIypphXtE
+                tuPWm+eh4NQwOucMI8E+SCYC2VHjGMmOk6yrLus2eu52VgHQXqVEesNq1Ijt
+                fS+UaqxvFcpDTWoRde/H01nB2RP1oHpMly5u+FRpvjX0os0Tm7crxRWrvMQP
+                KneYmzMLy2bZ5r0Uti/6Zm5jwSzJfXzRXnVMv1KmtbboVso5a8bmg+TdiuPb
+                RWvZ9mzSvOY4rm/6NjUahqmgEUJAXwsk+F2msnSgEyriJHFpl6GZQCIy8Cva
+                X9JCQYnGaFWIpzTqcn2ETEGG9KRK449IW2HtvtQOul40WUcD666qBrqD4Lzq
+                oRUHpYaTfiaknziDIFcnDnMVl0B4VXUV59dKuhojHbZIvsaZ+6+QSry7jf6+
+                bbxn9G8js433f+ZmbcgrKZEJfvykk/OSFJXx7OCDZhu1zsVoPYdUjci+HXz4
+                oskgUg8yRqS1DHKl2WY/CD0l0uYeZcdXKzX4J5QfEAm9GNyFso1rNyjqjXP0
+                38EngTxcpbDMtxJK/B90Kw0cpurlSBGH8wGSBdyWUYYbyzG4g0/3obUqAZkb
+                Cr9I0nxSmmsDr3B3IPUb2n9p2VdVX1rdlxY0KJdzEUvS11lJktL3sokepdrO
+                RhKfY1lqXyBy+Cz+Gsr9vle411y4OO4HRp38sWkuXO0GiBZdn8QDPJQGl2R+
+                OnOeqnLezJCOLyXBOr7irIxreITH0sPVmocBWb5tmM0tH37LW40jXZYrBC/Q
+                D8EPZgcVmr+h1QrNOcKdf4jQLKxZPKERqzyszcLGOqXhYQOFh0h66PBQ9KAF
+                46KHJQ+qh7iHR4Gkx4PhodPDQrCl34SHSQ9jHkY9Ns8GwpMeTv0H1Ho+rbgK
+                AAA=
+                """,
+        """
+                androidx/compose/ui/unit/DpKt.class:
+                H4sIAAAAAAAAAH1Qz0/UQBT+ZtrtlopQUJBdXH9gD0CiXYwHg1yMm00aV02U
+                cNnTbFtx2LbTtFPCccOBP8Q/wDPxYDZw848yviGcmcP3vve9N9/Me3///f4D
+                4A0Chp4okkrJ5CyMVV6qOg0bGTaF1OGg/KjbYAz+iTgVYSaK4/DL5CSNSbUY
+                WsepHpQM9na0M2TYvMOnjTa5xKqoddXEWlUvZV5m5upwZ7iIBXgeXNxj8AIZ
+                fA9ujVnE4Ab6h6yDhNKV0VTpTBbhp1SLRGjxjoHnpxYNwgzQE2xqCCf9TBrW
+                J5bsMezPZ0vefObxDe5x3/W4y7c6/nzW5X22y/v87fUFv75k89nVT8fp2q7l
+                21fn3Ka+jnF4bYB+0BvdMSP9BrSUQflqqmmyDypJGZZHskg/N/kkrQ7FJCNl
+                daRikR2JSpr8VvS+qaaK06E0SedrU2iZp0eyllR9XxRKCy1pedgDhw1zqA0t
+                OBSfUnZAkVN0rYPuxSUWf5kt4Bmhc1NZwHPi68Q4KfexRCp1Y5mY6dy6wSd4
+                QXGfaj55r4xhRViN8IAQDyOsYT3CI2yMwWp6vTtGq8Zmjcc1erXhzn8XAJq+
+                VwIAAA==
+                """
+    )
+
+    val Animatable: TestFile = compiledStub(
+        filename = "Animatable.kt",
+        filepath = "androidx/compose/animation/core",
+        checksum = 0x68ff47da,
+        """
+            package androidx.compose.animation.core
+
+            import androidx.compose.runtime.mutableStateOf
+
+            class Animatable<T, V>(
+                initialValue: T,
+                val typeConverter: V? = null
+            ){
+                private var internalState = mutableStateOf(initialValue)
+                val value: T
+                    get() = internalState.value
+            }
+
+            fun Animatable(initialValue: Float): Animatable<Float, Any> = Animatable(initialValue)
+        """,
+        """
+                META-INF/main.kotlin_module:
+                H4sIAAAAAAAAAGNgYGBmYGBgBGJ2KM3Apc8ln5iXUpSfmVKhl5yfW5BfnKqX
+                mJeZm1iSmZ8HFClKFeJxBPMTk3JSvUu4tLkkMDQUleaVZOamCvEH5yUWFGfk
+                lwSXJJYAFSsxaDEAAKFdFhZ2AAAA
+                """,
+        """
+                androidx/compose/animation/core/Animatable.class:
+                H4sIAAAAAAAAAI1VXW8aRxQ9syywrAEv1EkwidvEcRrATtZ20tYNlNZxGgkF
+                ksimqJLzsoaNswZ2rZ0BpS8V6m/oS1/7C1qpUdo+VCiP/VFR7yzEMYZUfti5
+                M/fj3DP33oF/3/79D4C7+JahYLkt33NaL82m1z32uG1artO1hOO5pPFtczs4
+                WgcdOwrGUCrV71WPrL5ldiz30HxycGQ3RbExQ1eeVjEYZ3VRqAyRkuM6osxw
+                MzcdNK3JNxhiuXq9WG8E+5Wq5x+aR7Y48C3H5XQD1xPBFbj5uNfpSPKUO5TL
+                N+KIQNcRxhxDQvxwbO94bt/2he0zpKczxZFAMgYF8wy5qUr5PVc4Xdvcc61j
+                /sITe5TUfkRXSjEku72gaIHuyXOG4oyr5asfxKydCicaH2FBRxoXiLXjElvX
+                6gQmKtm5MS4hI6+yyKCKFw5nWJsO/WDzqX5x2STH6jSsTo8SN87Vq0q17YmO
+                45pH/a75jrr5wH5u9TqCis+F32sKz69Zftv2i6MORXXi+QlNy6Et6pNNWsjl
+                Z81VOJenYWDQKGLMT6rqpLpxrvpE8WkcK1iew03kaFYCtBkFmhVbojxlcr/+
+                f3PoCTmK5JV6V5GaLawWVZd0SrcfohfJ5BJlYG1SvXTkaZ12rQ2Gn4eDjK5k
+                FF3R6DOGA9qoY0U4MxwUVG04MBgJZiibynro/mI6YqhZZWs4SOuaYoSzaoZt
+                sTe/RhQjsrtgRLNaWk1L87r2/ZufktKgDwe7F0556pRpLqtqMUPfTRnxAGzr
+                IRkipEwYuuS2SXTr9NE7BBW9Pyp+4v3k3G4Leq57zqFriZ5Ptsu7oxpW3L7D
+                HfLYfl8nms0dr0VO81XHtR/3uge2X5co8nl6TTl8viPPY+XKWaynlm91bRqV
+                CdAE9anZrlnH4zB9z+v5TfuhIw+LY4zGFBts0ByGqQsKvT36JSBZCk4FfEUy
+                QheOBWd6Wie21RPbGkmVJA00QijT6RnZZVfThdeIF9ZewSis/omLr5D9PYj9
+                WtooRsar0AhdR4r235Dm6igSl3EFCHZLxIgFu9PcNGyTjClyniQ9QxL4mPaS
+                QIlA5IXml8I//oIwqxVW117j6ij7fVpDYNoEjQgBarQmKUkK17A8vopJiDJ5
+                uPAHjN9O2EcCpRYwjo8cxoxH7K5PVC4lnxxpy8Hf0QhQJ8DsX8gznEWNn0LV
+                J1BvEKnRLoSdQBbxgOR35HuLGNzeR6gCs4J1WrEhl80K7uDuPhjHZ/h8H0mO
+                KxxfcGxxfMmxxJHgiHJc4shwXONY5tLnHsfKfxpFtNlABwAA
+                """,
+        """
+                androidx/compose/animation/core/AnimatableKt.class:
+                H4sIAAAAAAAAAJVRTW/TQBB9a+eDuqFxw1ebAoVyoRJi08KJIKQKKZKFCRKt
+                eslpE6+iTezdyl5HPeYncUQcUM78KMSsGykSXKi1np33/GY8H79+//gJ4C2O
+                GF4JneRGJdd8YrIrU0gutMqEVUYTk0t+VkExTuUn2wRjCGdiIXgq9JR/Gc/k
+                hFifIdjoGPjLwXH8/4n7DBe3i3gfb4oYpEbYfvx3Vf0PlPZFbPIpn0k7zoXS
+                BSXUxlYZCz40dlimab+FOhoBPGwxtJRWVon0UqQl9cEGDLvx3NhUaf5ZWpHQ
+                7ymtly18GiBzpkmyuXM84q+V83rkJScMb1bLMFgtA2/PC7ywSS+B1bLbpbu7
+                06l1vJ5XWb/HThthrUvYhZ7SWm43PjDc3RCv55ah9tEk1EI7VloOy2ws84ub
+                5XRiM3Ed5srhNbl1rqZa2DIn/+Brqa3KZKQXqlD0+WwzNVr0uSnziRwoF7a/
+                ll7+I8QJTbQG95DMjRg+DghxwlQw6kffEXxzc8Njso2KbOMJ2daNANvkAU8r
+                TROHa9WdCj+rbBfP6X7n2if9zgh+hHaEkCx2I3RwL8J9PBiBFXiIRyPUC3f2
+                CuxXZ/sPX0TSqAsDAAA=
+                """
+    )
+
+    val IntOffset: TestFile = compiledStub(
+        filename = "IntOffset.kt",
+        filepath = "androidx/compose/ui/unit",
+        checksum = 0xfd7af994,
+        """
+            package androidx.compose.ui.unit
+
+            class IntOffset(val x: Int, val y: Int)
+        """,
+        """
+                META-INF/main.kotlin_module:
+                H4sIAAAAAAAAAGNgYGBmYGBgBGJ2KM3ApcAlkZiXUpSfmVKhl5yfW5BfnKpX
+                mqlXmpdZIsTiUuBdosSgxQAA2sByTDoAAAA=
+                """,
+        """
+                androidx/compose/ui/unit/IntOffset.class:
+                H4sIAAAAAAAAAI1QTWsTURQ9781HJuO0mUwbTdOqtVZts3DS4k4RVCgMpBZq
+                CUo2TpJpfU0yI3kvJe7yW1y7ESyCCwku/VHifZMgCAWFmXPvuffcj3d//vr2
+                HcAjPGDYitPeKBO9SdjNhu8zmYRjEY5TocIoVUenpzJRBTAG/zy+iMNBnJ6F
+                R53zpEtRg8F+Ikj6lMHaiaLdFoOxs9vyYKHgwoTDwCb0Rx5cXCuCwyP2wcPy
+                nJUYTPVOSIbt5r/XeEzqs0S9zodEc/KGodzsZ2og0vAwUXEvVjHp+PDCoAcy
+                DQUa2afQRGjWIK+3x/B2Ng1cXuUu92dTlz7uOy53rOpsus8b7HklsH1e4w2D
+                rKntj482963j8jxKzKGqmunYfoGC5t9Bxy/oOfuMdoD35wUP+4rWfpH1EoZS
+                U6TJy/Gwk4xO4s6AIkEz68aDVjwSmi+C7qtsPOomB0KTteNxqsQwaQkpKPss
+                TTMVK5GlEnt0TpPexxHoW5MX6CuTNWgFCzbhFrFDUug7lOpfUayvX2KpvnEJ
+                /3NeepdQC0Gttgk351KUqRlyT7dmuaebc8qsYHXROiSrc1b9C5Y+XdnQmwsW
+                DcuoXFns/08xx70c7+A+2QPKXafcjTaMCNUIa4SoaViPsIGbbTCJW7jdRlEi
+                kNiUcHNclrAlViRWJSq/AaJQvyMZAwAA
+                """
+    )
 }
 
 /**
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt b/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
index db79120..ca943ef 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/Names.kt
@@ -24,6 +24,10 @@
 object Names {
     object Animation {
         val PackageName = Package("androidx.compose.animation")
+        object Core {
+            val PackageName = Package("androidx.compose.animation.core")
+            val Animatable = Name(PackageName, "Animatable")
+        }
     }
     object AnimationCore {
         val PackageName = Package("androidx.compose.animation.core")
@@ -34,6 +38,7 @@
         val Composable = Name(PackageName, "Composable")
         val CompositionLocal = Name(PackageName, "CompositionLocal")
         val DerivedStateOf = Name(PackageName, "derivedStateOf")
+        val State = Name(PackageName, "State")
         val MutableState = Name(PackageName, "MutableState")
         val MutableStateOf = Name(PackageName, "mutableStateOf")
         val MutableStateListOf = Name(PackageName, "mutableStateListOf")
@@ -56,6 +61,11 @@
             val PointerInputScopeModifier = Name(PackageName, "pointerInput")
             val AwaitPointerEventScope = Name(PackageName, "awaitPointerEventScope")
         }
+
+        object Unit {
+            val PackageName = Package("androidx.compose.ui.unit")
+            val Dp = Name(PackageName, "Dp")
+        }
     }
 
     object UiGraphics {
diff --git a/compose/material/material-icons-core/samples/build.gradle b/compose/material/material-icons-core/samples/build.gradle
index 160b0d3..e6d7d17 100644
--- a/compose/material/material-icons-core/samples/build.gradle
+++ b/compose/material/material-icons-core/samples/build.gradle
@@ -32,7 +32,7 @@
 
     implementation(project(":compose:material:material"))
     implementation(project(":compose:material:material-icons-core"))
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
 }
 
 androidx {
diff --git a/compose/material/material/build.gradle b/compose/material/material/build.gradle
index 744a208..7101859 100644
--- a/compose/material/material/build.gradle
+++ b/compose/material/material/build.gradle
@@ -33,12 +33,12 @@
          * corresponding block below
          */
         api("androidx.compose.animation:animation-core:1.0.0")
-        api("androidx.compose.foundation:foundation:1.2.0-rc02")
+        api("androidx.compose.foundation:foundation:1.2.0")
         api(project(":compose:material:material-icons-core"))
         api(project(":compose:material:material-ripple"))
-        api("androidx.compose.runtime:runtime:1.2.0-rc02")
-        api("androidx.compose.ui:ui:1.2.0-rc02")
-        api("androidx.compose.ui:ui-text:1.2.0-rc02")
+        api("androidx.compose.runtime:runtime:1.2.0")
+        api("androidx.compose.ui:ui:1.2.0")
+        api("androidx.compose.ui:ui-text:1.2.0")
 
         implementation(libs.kotlinStdlibCommon)
         implementation("androidx.compose.animation:animation:1.0.0")
diff --git a/compose/material/material/samples/build.gradle b/compose/material/material/samples/build.gradle
index bc63965..d1fb1b8 100644
--- a/compose/material/material/samples/build.gradle
+++ b/compose/material/material/samples/build.gradle
@@ -34,7 +34,7 @@
     implementation("androidx.compose.foundation:foundation:1.0.0")
     implementation("androidx.compose.foundation:foundation-layout:1.0.0")
     implementation(project(":compose:material:material"))
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.compose.ui:ui:1.0.0")
     implementation("androidx.compose.ui:ui-text:1.0.0")
 }
diff --git a/compose/material3/material3-window-size-class/build.gradle b/compose/material3/material3-window-size-class/build.gradle
index 97a9c94..68297e9 100644
--- a/compose/material3/material3-window-size-class/build.gradle
+++ b/compose/material3/material3-window-size-class/build.gradle
@@ -35,9 +35,9 @@
          * corresponding block below
          */
         implementation(libs.kotlinStdlibCommon)
-        api("androidx.compose.runtime:runtime:1.2.0-rc02")
-        api("androidx.compose.ui:ui:1.2.0-rc02")
-        api("androidx.compose.ui:ui-unit:1.2.0-rc02")
+        api("androidx.compose.runtime:runtime:1.2.0")
+        api("androidx.compose.ui:ui:1.2.0")
+        api("androidx.compose.ui:ui-unit:1.2.0")
         implementation("androidx.window:window:1.1.0-alpha02")
 
         testImplementation(libs.kotlinTest)
diff --git a/compose/material3/material3-window-size-class/samples/build.gradle b/compose/material3/material3-window-size-class/samples/build.gradle
index b900bde6..9f3187e 100644
--- a/compose/material3/material3-window-size-class/samples/build.gradle
+++ b/compose/material3/material3-window-size-class/samples/build.gradle
@@ -31,7 +31,7 @@
     compileOnly(project(":annotation:annotation-sampled"))
 
     implementation(project(":compose:material3:material3-window-size-class"))
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.activity:activity-compose:1.3.1")
 }
 
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index cdca37d..20967a5 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -34,12 +34,6 @@
     method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
-  public final class BadgeDefaults {
-    method @androidx.compose.runtime.Composable public long getContainerColor();
-    property @androidx.compose.runtime.Composable public final long containerColor;
-    field public static final androidx.compose.material3.BadgeDefaults INSTANCE;
-  }
-
   public final class BadgeKt {
   }
 
@@ -617,9 +611,9 @@
   }
 
   public final class TabKt {
-    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
-    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
-    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Immutable public final class TabPosition {
diff --git a/compose/material3/material3/api/public_plus_experimental_current.txt b/compose/material3/material3/api/public_plus_experimental_current.txt
index 5c3774a..74fa853 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -54,7 +54,7 @@
     field public static final androidx.compose.material3.AssistChipDefaults INSTANCE;
   }
 
-  public final class BadgeDefaults {
+  @androidx.compose.material3.ExperimentalMaterial3Api public final class BadgeDefaults {
     method @androidx.compose.runtime.Composable public long getContainerColor();
     property @androidx.compose.runtime.Composable public final long containerColor;
     field public static final androidx.compose.material3.BadgeDefaults INSTANCE;
@@ -605,7 +605,6 @@
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void DismissibleNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerTonalElevation, optional long drawerContainerColor, optional long drawerContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void ModalNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
-    method @Deprecated @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void NavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.material3.DrawerState drawerState, optional boolean gesturesEnabled, optional long scrimColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void NavigationDrawerItem(kotlin.jvm.functions.Function0<kotlin.Unit> label, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional kotlin.jvm.functions.Function0<kotlin.Unit>? badge, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.material3.NavigationDrawerItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PermanentDrawerSheet(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape drawerShape, optional float drawerTonalElevation, optional long drawerContainerColor, optional long drawerContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
     method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void PermanentNavigationDrawer(kotlin.jvm.functions.Function0<kotlin.Unit> drawerContent, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -857,9 +856,9 @@
   }
 
   public final class TabKt {
-    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
-    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
-    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Immutable public final class TabPosition {
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index cdca37d..20967a5 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -34,12 +34,6 @@
     method @androidx.compose.runtime.Composable public static void BottomAppBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.PaddingValues contentPadding, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
   }
 
-  public final class BadgeDefaults {
-    method @androidx.compose.runtime.Composable public long getContainerColor();
-    property @androidx.compose.runtime.Composable public final long containerColor;
-    field public static final androidx.compose.material3.BadgeDefaults INSTANCE;
-  }
-
   public final class BadgeKt {
   }
 
@@ -617,9 +611,9 @@
   }
 
   public final class TabKt {
-    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
-    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor);
-    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional long selectedContentColor, optional long unselectedContentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void LeadingIconTab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> text, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? text, optional kotlin.jvm.functions.Function0<kotlin.Unit>? icon, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource);
+    method @androidx.compose.runtime.Composable public static void Tab(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional long selectedContentColor, optional long unselectedContentColor, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Immutable public final class TabPosition {
diff --git a/compose/material3/material3/build.gradle b/compose/material3/material3/build.gradle
index ad7c743..5a04d78 100644
--- a/compose/material3/material3/build.gradle
+++ b/compose/material3/material3/build.gradle
@@ -39,16 +39,17 @@
         implementation("androidx.compose.animation:animation-core:1.1.1")
         implementation("androidx.compose.foundation:foundation-layout:1.1.1")
         implementation("androidx.compose.ui:ui-util:1.0.0")
-        api("androidx.compose.foundation:foundation:1.2.0-rc02")
+        api("androidx.compose.foundation:foundation:1.2.0")
         api("androidx.compose.material:material-icons-core:1.0.2")
         api("androidx.compose.material:material-ripple:1.0.0")
         api("androidx.compose.runtime:runtime:1.0.1")
         api("androidx.compose.ui:ui-graphics:1.0.1")
         api("androidx.compose.ui:ui:1.1.1")
-        api("androidx.compose.ui:ui-text:1.0.1")
+        // TODO: pin this to 1.3.0 stable, when PlatformTextStyle is not experimental
+        api(project(":compose:ui:ui-text"))
 
         // TODO: remove next 3 dependencies when b/202810604 is fixed
-        implementation("androidx.savedstate:savedstate-ktx:1.2.0-rc01")
+        implementation("androidx.savedstate:savedstate-ktx:1.2.0")
         implementation("androidx.lifecycle:lifecycle-runtime:2.3.0")
         implementation("androidx.lifecycle:lifecycle-viewmodel:2.3.0")
 
diff --git a/compose/material3/material3/lint-baseline.xml b/compose/material3/material3/lint-baseline.xml
new file mode 100644
index 0000000..328b7622
--- /dev/null
+++ b/compose/material3/material3/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="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/material3/material3/samples/build.gradle b/compose/material3/material3/samples/build.gradle
index 20b65a4..a3dc17b 100644
--- a/compose/material3/material3/samples/build.gradle
+++ b/compose/material3/material3/samples/build.gradle
@@ -34,12 +34,12 @@
     implementation("androidx.compose.animation:animation:1.0.0")
     implementation("androidx.compose.foundation:foundation:1.0.0")
     implementation("androidx.compose.foundation:foundation-layout:1.0.0")
-    implementation("androidx.compose.material:material:1.2.0-rc02")
+    implementation("androidx.compose.material:material:1.2.0")
     implementation(project(":compose:material3:material3"))
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation("androidx.compose.ui:ui:1.0.0")
     implementation("androidx.compose.ui:ui-text:1.0.0")
-    implementation("androidx.savedstate:savedstate-ktx:1.2.0-rc01")
+    implementation("androidx.savedstate:savedstate-ktx:1.2.0")
 }
 
 androidx {
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt
index facfde7..4ffa584 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/TabSamples.kt
@@ -67,9 +67,9 @@
         TabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
                 Tab(
-                    text = { Text(text = title, maxLines = 2, overflow = TextOverflow.Ellipsis) },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    text = { Text(text = title, maxLines = 2, overflow = TextOverflow.Ellipsis) }
                 )
             }
         }
@@ -89,9 +89,9 @@
         TabRow(selectedTabIndex = state) {
             icons.forEachIndexed { index, icon ->
                 Tab(
-                    icon = { Icon(icon, contentDescription = "Favorite") },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    icon = { Icon(icon, contentDescription = "Favorite") }
                 )
             }
         }
@@ -115,10 +115,10 @@
         TabRow(selectedTabIndex = state) {
             titlesAndIcons.forEachIndexed { index, (title, icon) ->
                 Tab(
-                    text = { Text(text = title, maxLines = 2, overflow = TextOverflow.Ellipsis) },
-                    icon = { Icon(icon, contentDescription = null) },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    text = { Text(text = title, maxLines = 2, overflow = TextOverflow.Ellipsis) },
+                    icon = { Icon(icon, contentDescription = null) }
                 )
             }
         }
@@ -142,10 +142,10 @@
         ScrollableTabRow(selectedTabIndex = state) {
             titlesAndIcons.forEachIndexed { index, (title, icon) ->
                 LeadingIconTab(
-                    text = { Text(title) },
-                    icon = { Icon(icon, contentDescription = null) },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    text = { Text(title) },
+                    icon = { Icon(icon, contentDescription = null) }
                 )
             }
         }
@@ -176,9 +176,9 @@
         ScrollableTabRow(selectedTabIndex = state) {
             titles.forEachIndexed { index, title ->
                 Tab(
-                    text = { Text(title) },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    text = { Text(title) }
                 )
             }
         }
@@ -230,9 +230,9 @@
         ) {
             titles.forEachIndexed { index, title ->
                 Tab(
-                    text = { Text(title) },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    text = { Text(title) }
                 )
             }
         }
@@ -261,9 +261,9 @@
         ) {
             titles.forEachIndexed { index, title ->
                 Tab(
-                    text = { Text(title) },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    text = { Text(title) }
                 )
             }
         }
@@ -301,9 +301,9 @@
         ) {
             titles.forEachIndexed { index, title ->
                 Tab(
-                    text = { Text(title) },
                     selected = state == index,
-                    onClick = { state = index }
+                    onClick = { state = index },
+                    text = { Text(title) }
                 )
             }
         }
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
index d6a0e95..fef9536 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationBarTest.kt
@@ -128,7 +128,7 @@
     }
 
     @Test
-    fun navigationBarItem_clearsSemanticsOfIcon_whenLabelIsPresent() {
+    fun navigationBarItem_clearsIconSemantics_whenLabelIsPresent() {
         rule.setMaterialContent(lightColorScheme()) {
             NavigationBar {
                 NavigationBarItem(
@@ -155,15 +155,26 @@
                     alwaysShowLabel = false,
                     onClick = {}
                 )
+                NavigationBarItem(
+                    modifier = Modifier.testTag("item3"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, "Favorite")
+                    },
+                    selected = false,
+                    onClick = {}
+                )
             }
         }
 
         val node1 = rule.onNodeWithTag("item1").fetchSemanticsNode()
         val node2 = rule.onNodeWithTag("item2").fetchSemanticsNode()
+        val node3 = rule.onNodeWithTag("item3").fetchSemanticsNode()
 
         assertThat(node1.config.getOrNull(SemanticsProperties.ContentDescription)).isNull()
         assertThat(node2.config.getOrNull(SemanticsProperties.ContentDescription))
             .isEqualTo(listOf("Favorite"))
+        assertThat(node3.config.getOrNull(SemanticsProperties.ContentDescription))
+            .isEqualTo(listOf("Favorite"))
     }
 
     @Test
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
index 06ebee9..8116075 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/NavigationRailTest.kt
@@ -129,7 +129,7 @@
     }
 
     @Test
-    fun navigationRailItem_clearsSemanticsOfIcon_whenLabelIsPresent() {
+    fun navigationRailItem_clearsIconSemantics_whenLabelIsPresent() {
         rule.setMaterialContent(lightColorScheme()) {
             NavigationRail {
                 NavigationRailItem(
@@ -156,15 +156,26 @@
                     alwaysShowLabel = false,
                     onClick = {}
                 )
+                NavigationRailItem(
+                    modifier = Modifier.testTag("item3"),
+                    icon = {
+                        Icon(Icons.Filled.Favorite, "Favorite")
+                    },
+                    selected = false,
+                    onClick = {}
+                )
             }
         }
 
         val node1 = rule.onNodeWithTag("item1").fetchSemanticsNode()
         val node2 = rule.onNodeWithTag("item2").fetchSemanticsNode()
+        val node3 = rule.onNodeWithTag("item3").fetchSemanticsNode()
 
         Truth.assertThat(node1.config.getOrNull(SemanticsProperties.ContentDescription)).isNull()
         Truth.assertThat(node2.config.getOrNull(SemanticsProperties.ContentDescription))
             .isEqualTo(listOf("Favorite"))
+        Truth.assertThat(node3.config.getOrNull(SemanticsProperties.ContentDescription))
+            .isEqualTo(listOf("Favorite"))
     }
 
     @Test
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt
index 1b6c68f..cced64f 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabScreenshotTest.kt
@@ -232,20 +232,20 @@
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         TabRow(selectedTabIndex = 0) {
             Tab(
-                text = { Text("TAB") },
                 selected = true,
-                interactionSource = interactionSource,
-                onClick = {}
+                onClick = {},
+                text = { Text("TAB") },
+                interactionSource = interactionSource
             )
             Tab(
-                text = { Text("TAB") },
                 selected = false,
-                onClick = {}
+                onClick = {},
+                text = { Text("TAB") }
             )
             Tab(
-                text = { Text("TAB") },
                 selected = false,
-                onClick = {}
+                onClick = {},
+                text = { Text("TAB") }
             )
         }
     }
@@ -277,26 +277,26 @@
                 )
             }) {
             Tab(
-                text = { Text("TAB") },
                 selected = true,
-                interactionSource = interactionSource,
+                onClick = {},
+                text = { Text("TAB") },
                 selectedContentColor = selectedContentColor,
                 unselectedContentColor = unselectedContentColor,
-                onClick = {}
+                interactionSource = interactionSource
             )
             Tab(
-                text = { Text("TAB") },
                 selected = false,
+                onClick = {},
+                text = { Text("TAB") },
                 selectedContentColor = selectedContentColor,
-                unselectedContentColor = unselectedContentColor,
-                onClick = {}
+                unselectedContentColor = unselectedContentColor
             )
             Tab(
-                text = { Text("TAB") },
                 selected = false,
+                onClick = {},
+                text = { Text("TAB") },
                 selectedContentColor = selectedContentColor,
-                unselectedContentColor = unselectedContentColor,
-                onClick = {}
+                unselectedContentColor = unselectedContentColor
             )
         }
     }
@@ -316,23 +316,23 @@
     Box(Modifier.semantics(mergeDescendants = true) {}.testTag(Tag)) {
         TabRow(selectedTabIndex = 0) {
             LeadingIconTab(
-                text = { Text("TAB") },
-                icon = { Icon(Icons.Filled.Favorite, contentDescription = "Favorite") },
                 selected = true,
-                interactionSource = interactionSource,
-                onClick = {}
-            )
-            LeadingIconTab(
+                onClick = {},
                 text = { Text("TAB") },
                 icon = { Icon(Icons.Filled.Favorite, contentDescription = "Favorite") },
-                selected = false,
-                onClick = {}
+                interactionSource = interactionSource
             )
             LeadingIconTab(
-                text = { Text("TAB") },
-                icon = { Icon(Icons.Filled.Favorite, contentDescription = "Favorite") },
                 selected = false,
-                onClick = {}
+                onClick = {},
+                text = { Text("TAB") },
+                icon = { Icon(Icons.Filled.Favorite, contentDescription = "Favorite") }
+            )
+            LeadingIconTab(
+                selected = false,
+                onClick = {},
+                text = { Text("TAB") },
+                icon = { Icon(Icons.Filled.Favorite, contentDescription = "Favorite") }
             )
         }
     }
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabTest.kt
index d8ded67..ed385e3 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/TabTest.kt
@@ -100,10 +100,10 @@
         rule.setMaterialContent(lightColorScheme()) {
             TabRow(0) {
                 Tab(
-                    text = { Text("Text") },
-                    modifier = Modifier.testTag("tab"),
                     selected = true,
-                    onClick = {}
+                    onClick = {},
+                    modifier = Modifier.testTag("tab"),
+                    text = { Text("Text") }
                 )
             }
         }
@@ -124,11 +124,11 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 Tab(
-                    enabled = false,
-                    text = { Text("Text") },
-                    modifier = Modifier.testTag("tab"),
                     selected = true,
-                    onClick = {}
+                    onClick = {},
+                    modifier = Modifier.testTag("tab"),
+                    enabled = false,
+                    text = { Text("Text") }
                 )
             }
         }
@@ -145,11 +145,11 @@
         rule.setMaterialContent(lightColorScheme()) {
             TabRow(0) {
                 LeadingIconTab(
+                    selected = true,
+                    onClick = {},
                     text = { Text("Text") },
                     icon = { Icon(icon, null) },
-                    modifier = Modifier.testTag("leadingIconTab"),
-                    selected = true,
-                    onClick = {}
+                    modifier = Modifier.testTag("leadingIconTab")
                 )
             }
         }
@@ -170,12 +170,12 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 LeadingIconTab(
-                    enabled = false,
+                    selected = true,
+                    onClick = {},
                     text = { Text("Text") },
                     icon = { Icon(icon, null) },
                     modifier = Modifier.testTag("leadingIconTab"),
-                    selected = true,
-                    onClick = {}
+                    enabled = false
                 )
             }
         }
@@ -191,7 +191,7 @@
     fun textTab_height() {
         rule
             .setMaterialContentForSizeAssertions {
-                Tab(text = { Text("Text") }, selected = true, onClick = {})
+                Tab(selected = true, onClick = {}, text = { Text("Text") })
             }
             .assertHeightIsEqualTo(ExpectedSmallTabHeight)
     }
@@ -200,7 +200,7 @@
     fun iconTab_height() {
         rule
             .setMaterialContentForSizeAssertions {
-                Tab(icon = { Icon(icon, null) }, selected = true, onClick = {})
+                Tab(selected = true, onClick = {}, icon = { Icon(icon, null) })
             }
             .assertHeightIsEqualTo(ExpectedSmallTabHeight)
     }
@@ -211,10 +211,10 @@
             .setMaterialContentForSizeAssertions {
                 Surface {
                     Tab(
-                        text = { Text("Text and Icon") },
-                        icon = { Icon(icon, null) },
                         selected = true,
-                        onClick = {}
+                        onClick = {},
+                        text = { Text("Text and Icon") },
+                        icon = { Icon(icon, null) }
                     )
                 }
             }
@@ -227,10 +227,10 @@
             .setMaterialContentForSizeAssertions {
                 Surface {
                     LeadingIconTab(
-                        text = { Text("Text") },
-                        icon = { Icon(icon, null) },
                         selected = true,
-                        onClick = {}
+                        onClick = {},
+                        text = { Text("Text") },
+                        icon = { Icon(icon, null) }
                     )
                 }
             }
@@ -263,9 +263,9 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            text = { Text(title) },
                             selected = state == index,
-                            onClick = { state = index }
+                            onClick = { state = index },
+                            text = { Text(title) }
                         )
                     }
                 }
@@ -308,10 +308,10 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            modifier = Modifier.height(tabRowHeight),
-                            text = { Text(title) },
                             selected = index == 0,
-                            onClick = {}
+                            onClick = {},
+                            modifier = Modifier.height(tabRowHeight),
+                            text = { Text(title) }
                         )
                     }
                 }
@@ -341,11 +341,11 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
+                            selected = state == index,
+                            onClick = { state = index },
                             text = {
                                 Text(title, Modifier.testTag("text"))
-                            },
-                            selected = state == index,
-                            onClick = { state = index }
+                            }
                         )
                     }
                 }
@@ -372,12 +372,12 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
+                            selected = state == index,
+                            onClick = { state = index },
                             text = {
                                 Text(title, Modifier.testTag("text"))
                             },
-                            icon = { Icon(Icons.Filled.Favorite, null) },
-                            selected = state == index,
-                            onClick = { state = index }
+                            icon = { Icon(Icons.Filled.Favorite, null) }
                         )
                     }
                 }
@@ -412,11 +412,11 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
+                            selected = state == index,
+                            onClick = { state = index },
                             text = {
                                 Text(title, Modifier.testTag("text"), maxLines = 2)
-                            },
-                            selected = state == index,
-                            onClick = { state = index }
+                            }
                         )
                     }
                 }
@@ -440,12 +440,12 @@
                     selectedTabIndex = 0
                 ) {
                     LeadingIconTab(
+                        selected = true,
+                        onClick = {},
                         text = {
                             Text("TAB", Modifier.testTag("text"))
                         },
-                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) },
-                        selected = true,
-                        onClick = {}
+                        icon = { Icon(Icons.Filled.Favorite, null, Modifier.testTag("icon")) }
                     )
                 }
             }
@@ -499,9 +499,9 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            text = { Text(title) },
                             selected = state == index,
-                            onClick = { state = index }
+                            onClick = { state = index },
+                            text = { Text(title) }
                         )
                     }
                 }
@@ -546,10 +546,10 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            modifier = Modifier.height(tabRowHeight),
-                            text = { Text(title) },
                             selected = index == 0,
-                            onClick = {}
+                            onClick = {},
+                            modifier = Modifier.height(tabRowHeight),
+                            text = { Text(title) }
                         )
                     }
                 }
@@ -685,9 +685,9 @@
                 ScrollableTabRow(selectedTabIndex = state) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            text = { Text(title) },
                             selected = state == index,
-                            onClick = { state = index }
+                            onClick = { state = index },
+                            text = { Text(title) }
                         )
                     }
                 }
@@ -757,9 +757,9 @@
                 ) {
                     titles.forEachIndexed { index, title ->
                         Tab(
-                            text = { Text(title) },
                             selected = state == index,
-                            onClick = { state = index }
+                            onClick = { state = index },
+                            text = { Text(title) }
                         )
                     }
                 }
@@ -802,11 +802,11 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 Tab(
-                    enabled = false,
-                    text = { Text("Text") },
-                    modifier = Modifier.testTag("tab"),
                     selected = true,
-                    onClick = { clicks++ }
+                    onClick = { clicks++ },
+                    modifier = Modifier.testTag("tab"),
+                    enabled = false,
+                    text = { Text("Text") }
                 )
             }
         }
@@ -825,12 +825,12 @@
         rule.setMaterialContent(lightColorScheme()) {
             Box {
                 LeadingIconTab(
-                    enabled = false,
+                    selected = true,
+                    onClick = { clicks++ },
                     text = { Text("Text") },
                     icon = { Icon(icon, null) },
                     modifier = Modifier.testTag("tab"),
-                    selected = true,
-                    onClick = { clicks++ }
+                    enabled = false
                 )
             }
         }
@@ -856,10 +856,10 @@
                 ) {
                     Surface {
                         Tab(
-                            text = { Text("Text") },
-                            icon = { Icon(icon, null) },
                             selected = true,
-                            onClick = {}
+                            onClick = {},
+                            text = { Text("Text") },
+                            icon = { Icon(icon, null) }
                         )
                     }
                 }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/IncludeFontPaddingHelper.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/IncludeFontPaddingHelper.android.kt
index d29b497..6cebcc5 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/IncludeFontPaddingHelper.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/IncludeFontPaddingHelper.android.kt
@@ -16,12 +16,10 @@
 
 package androidx.compose.material3
 
-import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.PlatformTextStyle
 import androidx.compose.ui.text.TextStyle
 
 // TODO(b/237588251) remove this once the default includeFontPadding is false
-@OptIn(ExperimentalTextApi::class)
 @Suppress("DEPRECATION")
 internal actual fun copyAndSetFontPadding(
     style: TextStyle,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
index 50ec60e..fe5ea6e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Badge.kt
@@ -185,6 +185,7 @@
 }
 
 /** Default values used for [Badge] implementations. */
+@ExperimentalMaterial3Api
 object BadgeDefaults {
     /** Default container color for a badge. */
     val containerColor: Color @Composable get() = BadgeTokens.Color.toColor()
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
index 04d6e20..8783c11 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/FloatingActionButton.kt
@@ -600,12 +600,12 @@
 
 private val ExtendedFabCollapseAnimation = fadeOut(
     animationSpec = tween(
-        durationMillis = MotionTokens.Duration100DurationMs.toInt(),
+        durationMillis = MotionTokens.DurationShort2.toInt(),
         easing = MotionTokens.EasingLinearCubicBezier,
     )
 ) + shrinkHorizontally(
     animationSpec = tween(
-        durationMillis = MotionTokens.Duration500DurationMs.toInt(),
+        durationMillis = MotionTokens.DurationLong2.toInt(),
         easing = MotionTokens.EasingEmphasizedCubicBezier,
     ),
     shrinkTowards = Alignment.Start,
@@ -613,13 +613,13 @@
 
 private val ExtendedFabExpandAnimation = fadeIn(
     animationSpec = tween(
-        durationMillis = MotionTokens.Duration200DurationMs.toInt(),
-        delayMillis = MotionTokens.Duration100DurationMs.toInt(),
+        durationMillis = MotionTokens.DurationShort4.toInt(),
+        delayMillis = MotionTokens.DurationShort2.toInt(),
         easing = MotionTokens.EasingLinearCubicBezier,
     ),
 ) + expandHorizontally(
     animationSpec = tween(
-        durationMillis = MotionTokens.Duration500DurationMs.toInt(),
+        durationMillis = MotionTokens.DurationLong2.toInt(),
         easing = MotionTokens.EasingEmphasizedCubicBezier,
     ),
     expandFrom = Alignment.Start,
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
index 0445c65..e231a10 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
@@ -852,7 +852,7 @@
             LocalContentColor.current
         } else {
             LocalContentColor.current
-                .copy(alpha = OutlinedIconButtonTokens.DisabledOutlineOpacity)
+                .copy(alpha = OutlinedIconButtonTokens.DisabledUnselectedOutlineOpacity)
         }
         return remember(color) {
             BorderStroke(OutlinedIconButtonTokens.UnselectedOutlineWidth, color)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
index 7209ef9..a6ffd46 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -161,7 +161,7 @@
     val styledIcon = @Composable {
         val iconColor by colors.iconColor(selected = selected)
         // If there's a label, don't have a11y services repeat the icon description.
-        val clearSemantics = alwaysShowLabel || selected
+        val clearSemantics = label != null && (alwaysShowLabel || selected)
         Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
             CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
         }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
index b948f05..0fea002 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
@@ -317,37 +317,6 @@
     }
 }
 
-@Composable
-@ExperimentalMaterial3Api
-@Deprecated(
-    "NavigationDrawer has been renamed to ModalNavigationDrawer to better specify " +
-        "its modal nature", replaceWith = ReplaceWith(
-        "ModalNavigationDrawer(drawerContent,\n" +
-            "        modifier,\n" +
-            "        drawerState,\n" +
-            "        gesturesEnabled,\n" +
-            "        scrimColor,\n" +
-            "        content)"
-    )
-)
-fun NavigationDrawer(
-    drawerContent: @Composable () -> Unit,
-    modifier: Modifier = Modifier,
-    drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
-    gesturesEnabled: Boolean = true,
-    scrimColor: Color = DrawerDefaults.scrimColor,
-    content: @Composable () -> Unit
-) {
-    ModalNavigationDrawer(
-        drawerContent,
-        modifier,
-        drawerState,
-        gesturesEnabled,
-        scrimColor,
-        content
-    )
-}
-
 /**
  * <a href="https://m3.material.io/components/navigation-drawer/overview" class="external" target="_blank">Material Design navigation drawer</a>.
  *
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
index 2e593e8..f23f0ed 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
@@ -165,7 +165,7 @@
     val styledIcon = @Composable {
         val iconColor by colors.iconColor(selected = selected)
         // If there's a label, don't have a11y services repeat the icon description.
-        val clearSemantics = alwaysShowLabel || selected
+        val clearSemantics = label != null && (alwaysShowLabel || selected)
         Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
             CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
         }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
index 24e3088..a3bd39e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -220,7 +220,6 @@
 /**
  * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
  */
-// TODO(b/200553810): Mark as experimental
 @ExperimentalMaterial3Api
 @kotlin.jvm.JvmInline
 value class FabPosition internal constructor(@Suppress("unused") private val value: Int) {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
index 105eb59..b66f8dd 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Tab.kt
@@ -79,12 +79,12 @@
  * services.
  * @param text the text label displayed in this tab
  * @param icon the icon displayed in this tab
- * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this tab. You can create and pass in your own `remember`ed instance to observe [Interaction]s
- * and customize the appearance / behavior of this tab in different states.
  * @param selectedContentColor the color for the content of this tab when selected, and the color
  * of the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this tab. You can create and pass in your own `remember`ed instance to observe [Interaction]s
+ * and customize the appearance / behavior of this tab in different states.
  *
  * @see LeadingIconTab
  */
@@ -96,9 +96,9 @@
     enabled: Boolean = true,
     text: @Composable (() -> Unit)? = null,
     icon: @Composable (() -> Unit)? = null,
-    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     selectedContentColor: Color = LocalContentColor.current,
-    unselectedContentColor: Color = selectedContentColor
+    unselectedContentColor: Color = selectedContentColor,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
 ) {
     val styledText: @Composable (() -> Unit)? = text?.let {
         @Composable {
@@ -113,9 +113,9 @@
         onClick,
         modifier,
         enabled,
-        interactionSource,
         selectedContentColor,
-        unselectedContentColor
+        unselectedContentColor,
+        interactionSource
     ) {
         TabBaselineLayout(icon = icon, text = styledText)
     }
@@ -142,12 +142,12 @@
  * @param enabled controls the enabled state of this tab. When `false`, this component will not
  * respond to user input, and it will appear visually disabled and disabled to accessibility
  * services.
- * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this tab. You can create and pass in your own `remember`ed instance to observe [Interaction]s
- * and customize the appearance / behavior of this tab in different states.
  * @param selectedContentColor the color for the content of this tab when selected, and the color
  * of the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this tab. You can create and pass in your own `remember`ed instance to observe [Interaction]s
+ * and customize the appearance / behavior of this tab in different states.
  *
  * @see Tab
  */
@@ -155,13 +155,13 @@
 fun LeadingIconTab(
     selected: Boolean,
     onClick: () -> Unit,
-    text: @Composable (() -> Unit),
-    icon: @Composable (() -> Unit),
+    text: @Composable () -> Unit,
+    icon: @Composable () -> Unit,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     selectedContentColor: Color = LocalContentColor.current,
-    unselectedContentColor: Color = selectedContentColor
+    unselectedContentColor: Color = selectedContentColor,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
 ) {
     // The color of the Ripple should always the be selected color, as we want to show the color
     // before the item is considered selected, and hence before the new contentColor is
@@ -214,12 +214,12 @@
  * @param enabled controls the enabled state of this tab. When `false`, this component will not
  * respond to user input, and it will appear visually disabled and disabled to accessibility
  * services.
- * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
- * for this tab. You can create and pass in your own `remember`ed instance to observe [Interaction]s
- * and customize the appearance / behavior of this tab in different states.
  * @param selectedContentColor the color for the content of this tab when selected, and the color
  * of the ripple.
  * @param unselectedContentColor the color for the content of this tab when not selected
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this tab. You can create and pass in your own `remember`ed instance to observe [Interaction]s
+ * and customize the appearance / behavior of this tab in different states.
  * @param content the content of this tab
  */
 @Composable
@@ -228,9 +228,9 @@
     onClick: () -> Unit,
     modifier: Modifier = Modifier,
     enabled: Boolean = true,
-    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     selectedContentColor: Color = LocalContentColor.current,
     unselectedContentColor: Color = selectedContentColor,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     content: @Composable ColumnScope.() -> Unit
 ) {
     // The color of the Ripple should always the selected color, as we want to show the color
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
index 8da4791..77881a5 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TabRow.kt
@@ -353,7 +353,7 @@
  * Contains default implementations and values used for TabRow.
  */
 object TabRowDefaults {
-    /** Default color of a tab row. */
+    /** Default container color of a tab row. */
     val containerColor: Color @Composable get() =
         PrimaryNavigationTabTokens.ContainerColor.toColor()
 
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledIconButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledIconButtonTokens.kt
index f5fb952..6b5effe 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledIconButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledIconButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_93
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalIconButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalIconButtonTokens.kt
index cbb9d40..7a1da2d 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalIconButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledTonalIconButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_93
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/IconButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/IconButtonTokens.kt
index 6cc1bc1..fd42bf0 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/IconButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/IconButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_93
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MotionTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MotionTokens.kt
index 08b43ad..8658f45 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MotionTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/MotionTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_92
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -21,22 +21,22 @@
 import androidx.compose.animation.core.CubicBezierEasing
 
 internal object MotionTokens {
-    const val Duration100DurationMs = 100.0
-    const val Duration1000DurationMs = 1000.0
-    const val Duration150DurationMs = 150.0
-    const val Duration200DurationMs = 200.0
-    const val Duration250DurationMs = 250.0
-    const val Duration300DurationMs = 300.0
-    const val Duration350DurationMs = 350.0
-    const val Duration400DurationMs = 400.0
-    const val Duration450DurationMs = 450.0
-    const val Duration50DurationMs = 50.0
-    const val Duration500DurationMs = 500.0
-    const val Duration550DurationMs = 550.0
-    const val Duration600DurationMs = 600.0
-    const val Duration700DurationMs = 700.0
-    const val Duration800DurationMs = 800.0
-    const val Duration900DurationMs = 900.0
+    const val DurationExtraLong1 = 700.0
+    const val DurationExtraLong2 = 800.0
+    const val DurationExtraLong3 = 900.0
+    const val DurationExtraLong4 = 1000.0
+    const val DurationLong1 = 450.0
+    const val DurationLong2 = 500.0
+    const val DurationLong3 = 550.0
+    const val DurationLong4 = 600.0
+    const val DurationMedium1 = 250.0
+    const val DurationMedium2 = 300.0
+    const val DurationMedium3 = 350.0
+    const val DurationMedium4 = 400.0
+    const val DurationShort1 = 50.0
+    const val DurationShort2 = 100.0
+    const val DurationShort3 = 150.0
+    const val DurationShort4 = 200.0
     val EasingEmphasizedCubicBezier = CubicBezierEasing(0.2f, 0.0f, 0.0f, 1.0f)
     val EasingEmphasizedAccelerateCubicBezier = CubicBezierEasing(0.3f, 0.0f, 0.8f, 0.15f)
     val EasingEmphasizedDecelerateCubicBezier = CubicBezierEasing(0.05f, 0.7f, 0.1f, 1.0f)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedIconButtonTokens.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedIconButtonTokens.kt
index cff5ada..657a0c9 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedIconButtonTokens.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedIconButtonTokens.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-// VERSION: v0_93
+// VERSION: v0_103
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 package androidx.compose.material3.tokens
@@ -25,8 +25,10 @@
     val ContainerSize = 40.0.dp
     val DisabledColor = ColorSchemeKeyTokens.OnSurface
     const val DisabledOpacity = 0.38f
-    val DisabledOutlineColor = ColorSchemeKeyTokens.OnSurface
-    const val DisabledOutlineOpacity = 0.12f
+    val DisabledSelectedContainerColor = ColorSchemeKeyTokens.OnSurface
+    const val DisabledSelectedContainerOpacity = 0.12f
+    val DisabledUnselectedOutlineColor = ColorSchemeKeyTokens.OnSurface
+    const val DisabledUnselectedOutlineOpacity = 0.12f
     val Size = 24.0.dp
     val SelectedContainerColor = ColorSchemeKeyTokens.InverseSurface
     val SelectedFocusColor = ColorSchemeKeyTokens.InverseOnSurface
diff --git a/compose/runtime/runtime-saveable/samples/build.gradle b/compose/runtime/runtime-saveable/samples/build.gradle
index 6de86a8..d8c834a 100644
--- a/compose/runtime/runtime-saveable/samples/build.gradle
+++ b/compose/runtime/runtime-saveable/samples/build.gradle
@@ -30,8 +30,8 @@
 
     compileOnly projectOrArtifact(":annotation:annotation-sampled")
 
-    implementation "androidx.compose.foundation:foundation:1.2.0-rc02"
-    implementation "androidx.compose.material:material:1.2.0-rc02"
+    implementation "androidx.compose.foundation:foundation:1.2.0"
+    implementation "androidx.compose.material:material:1.2.0"
     implementation project(":compose:runtime:runtime")
     implementation project(":compose:runtime:runtime-saveable")
 }
diff --git a/compose/ui/ui-graphics/samples/build.gradle b/compose/ui/ui-graphics/samples/build.gradle
index 2f8a070..3718028 100644
--- a/compose/ui/ui-graphics/samples/build.gradle
+++ b/compose/ui/ui-graphics/samples/build.gradle
@@ -30,7 +30,7 @@
 
     api(project(":compose:ui:ui-unit"))
     implementation("androidx.compose.foundation:foundation:1.0.0")
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation(project(":compose:ui:ui-graphics"))
     implementation(project(":compose:ui:ui-util"))
 }
diff --git a/compose/ui/ui-inspection/build.gradle b/compose/ui/ui-inspection/build.gradle
index 9a48117..d85ef1c 100644
--- a/compose/ui/ui-inspection/build.gradle
+++ b/compose/ui/ui-inspection/build.gradle
@@ -32,7 +32,7 @@
     // thus all its transitive dependencies will be present too.
     compileOnly(libs.kotlinStdlib)
     compileOnly("androidx.inspection:inspection:1.0.0")
-    compileOnly("androidx.compose.runtime:runtime:1.2.0-rc02")
+    compileOnly("androidx.compose.runtime:runtime:1.2.0")
     compileOnly(project(":compose:ui:ui"))
     // we ignore its transitive dependencies, because ui-inspection should
     // depend on them as "compile-only" deps.
diff --git a/compose/ui/ui-test/samples/build.gradle b/compose/ui/ui-test/samples/build.gradle
index c73e679..f403a04 100644
--- a/compose/ui/ui-test/samples/build.gradle
+++ b/compose/ui/ui-test/samples/build.gradle
@@ -33,7 +33,7 @@
     implementation(project(":compose:ui:ui-test"))
     implementation(project(":compose:ui:ui-test-junit4"))
 
-    implementation("androidx.compose.animation:animation:1.2.0-rc02")
+    implementation("androidx.compose.animation:animation:1.2.0")
     implementation("androidx.compose.material:material:1.1.0")
 }
 
diff --git a/compose/ui/ui-text-google-fonts/build.gradle b/compose/ui/ui-text-google-fonts/build.gradle
index 7c95e3c..2429100 100644
--- a/compose/ui/ui-text-google-fonts/build.gradle
+++ b/compose/ui/ui-text-google-fonts/build.gradle
@@ -28,7 +28,7 @@
 
     implementation(libs.kotlinStdlib)
 
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation(project(":compose:ui:ui-text"))
     implementation("androidx.core:core:1.8.0")
 
diff --git a/compose/ui/ui-text/api/current.ignore b/compose/ui/ui-text/api/current.ignore
index c585a57..8fe6362 100644
--- a/compose/ui/ui-text/api/current.ignore
+++ b/compose/ui/ui-text/api/current.ignore
@@ -1,31 +1,73 @@
 // Baseline format: 1.0
-InvalidNullConversion: androidx.compose.ui.text.font.FontKt#Font(int, androidx.compose.ui.text.font.FontWeight, int):
-    Attempted to remove @NonNull annotation from method androidx.compose.ui.text.font.FontKt.Font(int,androidx.compose.ui.text.font.FontWeight,int)
+AddSealed: androidx.compose.ui.text.Paragraph:
+    Cannot add 'sealed' modifier to class androidx.compose.ui.text.Paragraph: Incompatible change
 
 
-RemovedClass: androidx.compose.ui.text.TextLayoutResultKt:
-    Removed class androidx.compose.ui.text.TextLayoutResultKt
+AddedFinal: androidx.compose.ui.text.Paragraph#getBidiRunDirection(int):
+    Method androidx.compose.ui.text.Paragraph.getBidiRunDirection has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getBoundingBox(int):
+    Method androidx.compose.ui.text.Paragraph.getBoundingBox has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getCursorRect(int):
+    Method androidx.compose.ui.text.Paragraph.getCursorRect has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getDidExceedMaxLines():
+    Method androidx.compose.ui.text.Paragraph.getDidExceedMaxLines has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getFirstBaseline():
+    Method androidx.compose.ui.text.Paragraph.getFirstBaseline has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getHeight():
+    Method androidx.compose.ui.text.Paragraph.getHeight has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getHorizontalPosition(int, boolean):
+    Method androidx.compose.ui.text.Paragraph.getHorizontalPosition has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLastBaseline():
+    Method androidx.compose.ui.text.Paragraph.getLastBaseline has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineBottom(int):
+    Method androidx.compose.ui.text.Paragraph.getLineBottom has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineCount():
+    Method androidx.compose.ui.text.Paragraph.getLineCount has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineEnd(int, boolean):
+    Method androidx.compose.ui.text.Paragraph.getLineEnd has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineForOffset(int):
+    Method androidx.compose.ui.text.Paragraph.getLineForOffset has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineForVerticalPosition(float):
+    Method androidx.compose.ui.text.Paragraph.getLineForVerticalPosition has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineHeight(int):
+    Method androidx.compose.ui.text.Paragraph.getLineHeight has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineLeft(int):
+    Method androidx.compose.ui.text.Paragraph.getLineLeft has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineRight(int):
+    Method androidx.compose.ui.text.Paragraph.getLineRight has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineStart(int):
+    Method androidx.compose.ui.text.Paragraph.getLineStart has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineTop(int):
+    Method androidx.compose.ui.text.Paragraph.getLineTop has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineWidth(int):
+    Method androidx.compose.ui.text.Paragraph.getLineWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getMaxIntrinsicWidth():
+    Method androidx.compose.ui.text.Paragraph.getMaxIntrinsicWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getMinIntrinsicWidth():
+    Method androidx.compose.ui.text.Paragraph.getMinIntrinsicWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getOffsetForPosition(long):
+    Method androidx.compose.ui.text.Paragraph.getOffsetForPosition has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getParagraphDirection(int):
+    Method androidx.compose.ui.text.Paragraph.getParagraphDirection has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getPathForRange(int, int):
+    Method androidx.compose.ui.text.Paragraph.getPathForRange has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getPlaceholderRects():
+    Method androidx.compose.ui.text.Paragraph.getPlaceholderRects has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getWidth():
+    Method androidx.compose.ui.text.Paragraph.getWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getWordBoundary(int):
+    Method androidx.compose.ui.text.Paragraph.getWordBoundary has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#isLineEllipsized(int):
+    Method androidx.compose.ui.text.Paragraph.isLineEllipsized has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration):
+    Method androidx.compose.ui.text.Paragraph.paint has added 'final' qualifier
 
 
-RemovedMethod: androidx.compose.ui.text.PlaceholderVerticalAlign#PlaceholderVerticalAlign():
-    Removed constructor androidx.compose.ui.text.PlaceholderVerticalAlign()
-RemovedMethod: androidx.compose.ui.text.TextRange#TextRange():
-    Removed constructor androidx.compose.ui.text.TextRange()
-RemovedMethod: androidx.compose.ui.text.font.FontStyle#FontStyle():
-    Removed constructor androidx.compose.ui.text.font.FontStyle()
-RemovedMethod: androidx.compose.ui.text.font.FontSynthesis#FontSynthesis():
-    Removed constructor androidx.compose.ui.text.font.FontSynthesis()
-RemovedMethod: androidx.compose.ui.text.input.ImeAction#ImeAction():
-    Removed constructor androidx.compose.ui.text.input.ImeAction()
-RemovedMethod: androidx.compose.ui.text.input.KeyboardCapitalization#KeyboardCapitalization():
-    Removed constructor androidx.compose.ui.text.input.KeyboardCapitalization()
-RemovedMethod: androidx.compose.ui.text.input.KeyboardType#KeyboardType():
-    Removed constructor androidx.compose.ui.text.input.KeyboardType()
-RemovedMethod: androidx.compose.ui.text.style.BaselineShift#BaselineShift():
-    Removed constructor androidx.compose.ui.text.style.BaselineShift()
-RemovedMethod: androidx.compose.ui.text.style.TextAlign#TextAlign():
-    Removed constructor androidx.compose.ui.text.style.TextAlign()
-RemovedMethod: androidx.compose.ui.text.style.TextDirection#TextDirection():
-    Removed constructor androidx.compose.ui.text.style.TextDirection()
-RemovedMethod: androidx.compose.ui.text.style.TextOverflow#TextOverflow():
-    Removed constructor androidx.compose.ui.text.style.TextOverflow()
+DefaultValueChange: androidx.compose.ui.text.Paragraph#getLineEnd(int, boolean) parameter #1:
+    Attempted to remove default value from parameter visibleEnd in androidx.compose.ui.text.Paragraph.getLineEnd
+DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #1:
+    Attempted to remove default value from parameter color in androidx.compose.ui.text.Paragraph.paint
+DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #2:
+    Attempted to remove default value from parameter shadow in androidx.compose.ui.text.Paragraph.paint
+DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #3:
+    Attempted to remove default value from parameter textDecoration in androidx.compose.ui.text.Paragraph.paint
diff --git a/compose/ui/ui-text/api/current.txt b/compose/ui/ui-text/api/current.txt
index 0f4ee9f..060bf6e 100644
--- a/compose/ui/ui-text/api/current.txt
+++ b/compose/ui/ui-text/api/current.txt
@@ -4,7 +4,12 @@
   public final class ActualAtomicReferenceJvmKt {
   }
 
+  public final class AndroidParagraph_androidKt {
+  }
+
   public final class AndroidTextStyle_androidKt {
+    method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
+    method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
   }
 
   @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
@@ -153,7 +158,7 @@
   public final class MultiParagraphKt {
   }
 
-  @kotlin.jvm.JvmDefaultWithCompatibility public interface Paragraph {
+  public sealed interface Paragraph {
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
     method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
@@ -164,7 +169,7 @@
     method public float getLastBaseline();
     method public float getLineBottom(int lineIndex);
     method public int getLineCount();
-    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineEnd(int lineIndex, boolean visibleEnd);
     method public int getLineForOffset(int offset);
     method public int getLineForVerticalPosition(float vertical);
     method public float getLineHeight(int lineIndex);
@@ -182,7 +187,7 @@
     method public float getWidth();
     method public long getWordBoundary(int offset);
     method public boolean isLineEllipsized(int lineIndex);
-    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration);
     property public abstract boolean didExceedMaxLines;
     property public abstract float firstBaseline;
     property public abstract float height;
@@ -217,16 +222,22 @@
   }
 
   @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public operator boolean equals(Object? other);
     method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
     method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
     method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
     method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
     method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle merge(optional androidx.compose.ui.text.ParagraphStyle? other);
     method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.ParagraphStyle plus(androidx.compose.ui.text.ParagraphStyle other);
     property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? platformStyle;
     property public final androidx.compose.ui.text.style.TextAlign? textAlign;
     property public final androidx.compose.ui.text.style.TextDirection? textDirection;
     property public final androidx.compose.ui.text.style.TextIndent? textIndent;
@@ -269,12 +280,47 @@
     property public final int Top;
   }
 
+  public final class PlatformParagraphStyle {
+    ctor @Deprecated public PlatformParagraphStyle(optional boolean includeFontPadding);
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    property @Deprecated public final boolean includeFontPadding;
+    field public static final androidx.compose.ui.text.PlatformParagraphStyle.Companion Companion;
+  }
+
+  public static final class PlatformParagraphStyle.Companion {
+    method public androidx.compose.ui.text.PlatformParagraphStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle Default;
+  }
+
+  public final class PlatformSpanStyle {
+    ctor public PlatformSpanStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle merge(androidx.compose.ui.text.PlatformSpanStyle? other);
+    field public static final androidx.compose.ui.text.PlatformSpanStyle.Companion Companion;
+  }
+
+  public static final class PlatformSpanStyle.Companion {
+    method public androidx.compose.ui.text.PlatformSpanStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformSpanStyle Default;
+  }
+
+  public final class PlatformTextStyle {
+    ctor public PlatformTextStyle(androidx.compose.ui.text.PlatformSpanStyle? spanStyle, androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle);
+    ctor @Deprecated public PlatformTextStyle(optional boolean includeFontPadding);
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getParagraphStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getSpanStyle();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
+  }
+
   public final class SaversKt {
   }
 
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     method public operator boolean equals(Object? other);
     method public long getBackground();
     method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
@@ -287,6 +333,7 @@
     method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
     method public long getLetterSpacing();
     method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getPlatformStyle();
     method public androidx.compose.ui.graphics.Shadow? getShadow();
     method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
     method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
@@ -303,6 +350,7 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
     property public final long letterSpacing;
     property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? platformStyle;
     property public final androidx.compose.ui.graphics.Shadow? shadow;
     property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
     property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
@@ -443,7 +491,9 @@
 
   @androidx.compose.runtime.Immutable public final class TextStyle {
     ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public long getBackground();
     method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
     method public long getColor();
@@ -455,7 +505,9 @@
     method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
     method public long getLetterSpacing();
     method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
     method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformTextStyle? getPlatformStyle();
     method public androidx.compose.ui.graphics.Shadow? getShadow();
     method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
     method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
@@ -482,7 +534,9 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
     property public final long letterSpacing;
     property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
     property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.text.PlatformTextStyle? platformStyle;
     property public final androidx.compose.ui.graphics.Shadow? shadow;
     property public final androidx.compose.ui.text.style.TextAlign? textAlign;
     property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
@@ -588,6 +642,9 @@
   public final class AndroidFontUtils_androidKt {
   }
 
+  public final class AndroidLoadableFontsKt {
+  }
+
   public final class AndroidTypeface_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
     method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -1225,6 +1282,50 @@
     method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
   }
 
+  public final class LineHeightStyle {
+    ctor public LineHeightStyle(float alignment, int trim);
+    method public float getAlignment();
+    method public int getTrim();
+    property public final float alignment;
+    property public final int trim;
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Companion Companion;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Alignment {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Alignment.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Alignment.Companion {
+    method public float getBottom();
+    method public float getCenter();
+    method public float getProportional();
+    method public float getTop();
+    property public final float Bottom;
+    property public final float Center;
+    property public final float Proportional;
+    property public final float Top;
+  }
+
+  public static final class LineHeightStyle.Companion {
+    method public androidx.compose.ui.text.style.LineHeightStyle getDefault();
+    property public final androidx.compose.ui.text.style.LineHeightStyle Default;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Trim {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Trim.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Trim.Companion {
+    method public int getBoth();
+    method public int getFirstLineTop();
+    method public int getLastLineBottom();
+    method public int getNone();
+    property public final int Both;
+    property public final int FirstLineTop;
+    property public final int LastLineBottom;
+    property public final int None;
+  }
+
   public enum ResolvedTextDirection {
     method public static androidx.compose.ui.text.style.ResolvedTextDirection valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.compose.ui.text.style.ResolvedTextDirection[] values();
diff --git a/compose/ui/ui-text/api/public_plus_experimental_current.txt b/compose/ui/ui-text/api/public_plus_experimental_current.txt
index e614389c..212b3c9 100644
--- a/compose/ui/ui-text/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-text/api/public_plus_experimental_current.txt
@@ -4,9 +4,12 @@
   public final class ActualAtomicReferenceJvmKt {
   }
 
+  public final class AndroidParagraph_androidKt {
+  }
+
   public final class AndroidTextStyle_androidKt {
-    method @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
-    method @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
+    method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
+    method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
   }
 
   @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
@@ -169,7 +172,7 @@
   public final class MultiParagraphKt {
   }
 
-  @kotlin.jvm.JvmDefaultWithCompatibility public interface Paragraph {
+  public sealed interface Paragraph {
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
     method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
@@ -180,7 +183,7 @@
     method public float getLastBaseline();
     method public float getLineBottom(int lineIndex);
     method public int getLineCount();
-    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineEnd(int lineIndex, boolean visibleEnd);
     method public int getLineForOffset(int offset);
     method public int getLineForVerticalPosition(float vertical);
     method public float getLineHeight(int lineIndex);
@@ -198,8 +201,8 @@
     method public float getWidth();
     method public long getWordBoundary(int offset);
     method public boolean isLineEllipsized(int lineIndex);
-    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
-    method @androidx.compose.ui.text.ExperimentalTextApi public default void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, optional float alpha, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    method @androidx.compose.ui.text.ExperimentalTextApi public void paint(androidx.compose.ui.graphics.Canvas canvas, androidx.compose.ui.graphics.Brush brush, float alpha, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration);
     property public abstract boolean didExceedMaxLines;
     property public abstract float firstBaseline;
     property public abstract float height;
@@ -234,22 +237,22 @@
   }
 
   @androidx.compose.runtime.Immutable public final class ParagraphStyle {
-    ctor @androidx.compose.ui.text.ExperimentalTextApi public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional @androidx.compose.ui.text.ExperimentalTextApi androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional @androidx.compose.ui.text.ExperimentalTextApi androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public operator boolean equals(Object? other);
     method public long getLineHeight();
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
     method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
     method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
     method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
     method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle merge(optional androidx.compose.ui.text.ParagraphStyle? other);
     method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.ParagraphStyle plus(androidx.compose.ui.text.ParagraphStyle other);
     property public final long lineHeight;
-    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
-    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.PlatformParagraphStyle? platformStyle;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? platformStyle;
     property public final androidx.compose.ui.text.style.TextAlign? textAlign;
     property public final androidx.compose.ui.text.style.TextDirection? textDirection;
     property public final androidx.compose.ui.text.style.TextIndent? textIndent;
@@ -292,7 +295,7 @@
     property public final int Top;
   }
 
-  @androidx.compose.ui.text.ExperimentalTextApi public final class PlatformParagraphStyle {
+  public final class PlatformParagraphStyle {
     ctor @Deprecated public PlatformParagraphStyle(optional boolean includeFontPadding);
     method @Deprecated public boolean getIncludeFontPadding();
     method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
@@ -305,7 +308,7 @@
     property public final androidx.compose.ui.text.PlatformParagraphStyle Default;
   }
 
-  @androidx.compose.ui.text.ExperimentalTextApi public final class PlatformSpanStyle {
+  public final class PlatformSpanStyle {
     ctor public PlatformSpanStyle();
     method public androidx.compose.ui.text.PlatformSpanStyle merge(androidx.compose.ui.text.PlatformSpanStyle? other);
     field public static final androidx.compose.ui.text.PlatformSpanStyle.Companion Companion;
@@ -316,7 +319,7 @@
     property public final androidx.compose.ui.text.PlatformSpanStyle Default;
   }
 
-  @androidx.compose.ui.text.ExperimentalTextApi public final class PlatformTextStyle {
+  public final class PlatformTextStyle {
     ctor public PlatformTextStyle(androidx.compose.ui.text.PlatformSpanStyle? spanStyle, androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle);
     ctor @Deprecated public PlatformTextStyle(optional boolean includeFontPadding);
     method public androidx.compose.ui.text.PlatformParagraphStyle? getParagraphStyle();
@@ -330,10 +333,10 @@
 
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
-    ctor @androidx.compose.ui.text.ExperimentalTextApi public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     ctor @androidx.compose.ui.text.ExperimentalTextApi public SpanStyle(androidx.compose.ui.graphics.Brush? brush, optional float alpha, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.SpanStyle copy(androidx.compose.ui.graphics.Brush? brush, optional float alpha, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     method public operator boolean equals(Object? other);
     method @androidx.compose.ui.text.ExperimentalTextApi public float getAlpha();
@@ -349,7 +352,7 @@
     method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
     method public long getLetterSpacing();
     method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.PlatformSpanStyle? getPlatformStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getPlatformStyle();
     method public androidx.compose.ui.graphics.Shadow? getShadow();
     method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
     method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
@@ -368,7 +371,7 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
     property public final long letterSpacing;
     property public final androidx.compose.ui.text.intl.LocaleList? localeList;
-    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.PlatformSpanStyle? platformStyle;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? platformStyle;
     property public final androidx.compose.ui.graphics.Shadow? shadow;
     property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
     property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
@@ -518,10 +521,10 @@
 
   @androidx.compose.runtime.Immutable public final class TextStyle {
     ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
-    ctor @androidx.compose.ui.text.ExperimentalTextApi public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     ctor @androidx.compose.ui.text.ExperimentalTextApi public TextStyle(androidx.compose.ui.graphics.Brush? brush, optional float alpha, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.TextStyle copy(androidx.compose.ui.graphics.Brush? brush, optional float alpha, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method @androidx.compose.ui.text.ExperimentalTextApi public float getAlpha();
     method public long getBackground();
@@ -536,9 +539,9 @@
     method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
     method public long getLetterSpacing();
     method public long getLineHeight();
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
     method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
-    method @androidx.compose.ui.text.ExperimentalTextApi public androidx.compose.ui.text.PlatformTextStyle? getPlatformStyle();
+    method public androidx.compose.ui.text.PlatformTextStyle? getPlatformStyle();
     method public androidx.compose.ui.graphics.Shadow? getShadow();
     method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
     method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
@@ -567,9 +570,9 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
     property public final long letterSpacing;
     property public final long lineHeight;
-    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
     property public final androidx.compose.ui.text.intl.LocaleList? localeList;
-    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.PlatformTextStyle? platformStyle;
+    property public final androidx.compose.ui.text.PlatformTextStyle? platformStyle;
     property public final androidx.compose.ui.graphics.Shadow? shadow;
     property public final androidx.compose.ui.text.style.TextAlign? textAlign;
     property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
@@ -660,11 +663,14 @@
 package androidx.compose.ui.text.font {
 
   public abstract class AndroidFont implements androidx.compose.ui.text.font.Font {
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader, androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
     ctor public AndroidFont(int loadingStrategy, androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader);
     method public final int getLoadingStrategy();
     method public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader getTypefaceLoader();
+    method @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.font.FontVariation.Settings getVariationSettings();
     property public final int loadingStrategy;
     property public final androidx.compose.ui.text.font.AndroidFont.TypefaceLoader typefaceLoader;
+    property @androidx.compose.ui.text.ExperimentalTextApi public final androidx.compose.ui.text.font.FontVariation.Settings variationSettings;
   }
 
   public static interface AndroidFont.TypefaceLoader {
@@ -673,10 +679,6 @@
   }
 
   public final class AndroidFontKt {
-    method @Deprecated @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.content.res.AssetManager assetManager, String path, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
-    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(String path, android.content.res.AssetManager assetManager, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
-    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
-    method @RequiresApi(26) @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
   }
 
   public final class AndroidFontLoader_androidKt {
@@ -688,6 +690,13 @@
   public final class AndroidFontUtils_androidKt {
   }
 
+  public final class AndroidLoadableFontsKt {
+    method @Deprecated @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.content.res.AssetManager assetManager, String path, optional androidx.compose.ui.text.font.FontWeight weight, optional int style);
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(String path, android.content.res.AssetManager assetManager, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(java.io.File file, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+    method @RequiresApi(26) @androidx.compose.runtime.Stable @androidx.compose.ui.text.ExperimentalTextApi public static androidx.compose.ui.text.font.Font Font(android.os.ParcelFileDescriptor fileDescriptor, optional androidx.compose.ui.text.font.FontWeight weight, optional int style, optional androidx.compose.ui.text.font.FontVariation.Settings variationSettings);
+  }
+
   public final class AndroidTypeface_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
     method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -829,6 +838,32 @@
   public final class FontSynthesis_androidKt {
   }
 
+  @androidx.compose.ui.text.ExperimentalTextApi public final class FontVariation {
+    method public androidx.compose.ui.text.font.FontVariation.Setting Setting(String name, float value);
+    method public androidx.compose.ui.text.font.FontVariation.Settings Settings(androidx.compose.ui.text.font.FontWeight weight, int style, androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public androidx.compose.ui.text.font.FontVariation.Setting grade(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting italic(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting opticalSizing(long textSize);
+    method public androidx.compose.ui.text.font.FontVariation.Setting slant(float value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting weight(int value);
+    method public androidx.compose.ui.text.font.FontVariation.Setting width(float value);
+    field public static final androidx.compose.ui.text.font.FontVariation INSTANCE;
+  }
+
+  @androidx.compose.runtime.Immutable public static interface FontVariation.Setting {
+    method public String getAxisName();
+    method public boolean getNeedsDensity();
+    method public float toVariationValue(androidx.compose.ui.unit.Density? density);
+    property public abstract String axisName;
+    property public abstract boolean needsDensity;
+  }
+
+  @androidx.compose.runtime.Immutable public static final class FontVariation.Settings {
+    ctor public FontVariation.Settings(androidx.compose.ui.text.font.FontVariation.Setting... settings);
+    method public java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> getSettings();
+    property public final java.util.List<androidx.compose.ui.text.font.FontVariation.Setting> settings;
+  }
+
   @androidx.compose.runtime.Immutable public final class FontWeight implements java.lang.Comparable<androidx.compose.ui.text.font.FontWeight> {
     ctor public FontWeight(int weight);
     method public operator int compareTo(androidx.compose.ui.text.font.FontWeight other);
@@ -1340,28 +1375,29 @@
     method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
   }
 
-  @androidx.compose.ui.text.ExperimentalTextApi public final class LineHeightStyle {
-    ctor public LineHeightStyle(int alignment, int trim);
-    method public int getAlignment();
+  public final class LineHeightStyle {
+    ctor public LineHeightStyle(float alignment, int trim);
+    method public float getAlignment();
     method public int getTrim();
-    property public final int alignment;
+    property public final float alignment;
     property public final int trim;
     field public static final androidx.compose.ui.text.style.LineHeightStyle.Companion Companion;
   }
 
-  @androidx.compose.ui.text.ExperimentalTextApi @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Alignment {
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Alignment {
+    ctor @androidx.compose.ui.text.ExperimentalTextApi public LineHeightStyle.Alignment(float topRatio);
     field public static final androidx.compose.ui.text.style.LineHeightStyle.Alignment.Companion Companion;
   }
 
   public static final class LineHeightStyle.Alignment.Companion {
-    method public int getBottom();
-    method public int getCenter();
-    method public int getProportional();
-    method public int getTop();
-    property public final int Bottom;
-    property public final int Center;
-    property public final int Proportional;
-    property public final int Top;
+    method public float getBottom();
+    method public float getCenter();
+    method public float getProportional();
+    method public float getTop();
+    property public final float Bottom;
+    property public final float Center;
+    property public final float Proportional;
+    property public final float Top;
   }
 
   public static final class LineHeightStyle.Companion {
@@ -1369,7 +1405,7 @@
     property public final androidx.compose.ui.text.style.LineHeightStyle Default;
   }
 
-  @androidx.compose.ui.text.ExperimentalTextApi @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Trim {
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Trim {
     field public static final androidx.compose.ui.text.style.LineHeightStyle.Trim.Companion Companion;
   }
 
diff --git a/compose/ui/ui-text/api/restricted_current.ignore b/compose/ui/ui-text/api/restricted_current.ignore
index c585a57..8fe6362 100644
--- a/compose/ui/ui-text/api/restricted_current.ignore
+++ b/compose/ui/ui-text/api/restricted_current.ignore
@@ -1,31 +1,73 @@
 // Baseline format: 1.0
-InvalidNullConversion: androidx.compose.ui.text.font.FontKt#Font(int, androidx.compose.ui.text.font.FontWeight, int):
-    Attempted to remove @NonNull annotation from method androidx.compose.ui.text.font.FontKt.Font(int,androidx.compose.ui.text.font.FontWeight,int)
+AddSealed: androidx.compose.ui.text.Paragraph:
+    Cannot add 'sealed' modifier to class androidx.compose.ui.text.Paragraph: Incompatible change
 
 
-RemovedClass: androidx.compose.ui.text.TextLayoutResultKt:
-    Removed class androidx.compose.ui.text.TextLayoutResultKt
+AddedFinal: androidx.compose.ui.text.Paragraph#getBidiRunDirection(int):
+    Method androidx.compose.ui.text.Paragraph.getBidiRunDirection has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getBoundingBox(int):
+    Method androidx.compose.ui.text.Paragraph.getBoundingBox has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getCursorRect(int):
+    Method androidx.compose.ui.text.Paragraph.getCursorRect has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getDidExceedMaxLines():
+    Method androidx.compose.ui.text.Paragraph.getDidExceedMaxLines has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getFirstBaseline():
+    Method androidx.compose.ui.text.Paragraph.getFirstBaseline has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getHeight():
+    Method androidx.compose.ui.text.Paragraph.getHeight has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getHorizontalPosition(int, boolean):
+    Method androidx.compose.ui.text.Paragraph.getHorizontalPosition has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLastBaseline():
+    Method androidx.compose.ui.text.Paragraph.getLastBaseline has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineBottom(int):
+    Method androidx.compose.ui.text.Paragraph.getLineBottom has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineCount():
+    Method androidx.compose.ui.text.Paragraph.getLineCount has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineEnd(int, boolean):
+    Method androidx.compose.ui.text.Paragraph.getLineEnd has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineForOffset(int):
+    Method androidx.compose.ui.text.Paragraph.getLineForOffset has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineForVerticalPosition(float):
+    Method androidx.compose.ui.text.Paragraph.getLineForVerticalPosition has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineHeight(int):
+    Method androidx.compose.ui.text.Paragraph.getLineHeight has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineLeft(int):
+    Method androidx.compose.ui.text.Paragraph.getLineLeft has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineRight(int):
+    Method androidx.compose.ui.text.Paragraph.getLineRight has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineStart(int):
+    Method androidx.compose.ui.text.Paragraph.getLineStart has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineTop(int):
+    Method androidx.compose.ui.text.Paragraph.getLineTop has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getLineWidth(int):
+    Method androidx.compose.ui.text.Paragraph.getLineWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getMaxIntrinsicWidth():
+    Method androidx.compose.ui.text.Paragraph.getMaxIntrinsicWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getMinIntrinsicWidth():
+    Method androidx.compose.ui.text.Paragraph.getMinIntrinsicWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getOffsetForPosition(long):
+    Method androidx.compose.ui.text.Paragraph.getOffsetForPosition has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getParagraphDirection(int):
+    Method androidx.compose.ui.text.Paragraph.getParagraphDirection has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getPathForRange(int, int):
+    Method androidx.compose.ui.text.Paragraph.getPathForRange has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getPlaceholderRects():
+    Method androidx.compose.ui.text.Paragraph.getPlaceholderRects has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getWidth():
+    Method androidx.compose.ui.text.Paragraph.getWidth has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#getWordBoundary(int):
+    Method androidx.compose.ui.text.Paragraph.getWordBoundary has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#isLineEllipsized(int):
+    Method androidx.compose.ui.text.Paragraph.isLineEllipsized has added 'final' qualifier
+AddedFinal: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration):
+    Method androidx.compose.ui.text.Paragraph.paint has added 'final' qualifier
 
 
-RemovedMethod: androidx.compose.ui.text.PlaceholderVerticalAlign#PlaceholderVerticalAlign():
-    Removed constructor androidx.compose.ui.text.PlaceholderVerticalAlign()
-RemovedMethod: androidx.compose.ui.text.TextRange#TextRange():
-    Removed constructor androidx.compose.ui.text.TextRange()
-RemovedMethod: androidx.compose.ui.text.font.FontStyle#FontStyle():
-    Removed constructor androidx.compose.ui.text.font.FontStyle()
-RemovedMethod: androidx.compose.ui.text.font.FontSynthesis#FontSynthesis():
-    Removed constructor androidx.compose.ui.text.font.FontSynthesis()
-RemovedMethod: androidx.compose.ui.text.input.ImeAction#ImeAction():
-    Removed constructor androidx.compose.ui.text.input.ImeAction()
-RemovedMethod: androidx.compose.ui.text.input.KeyboardCapitalization#KeyboardCapitalization():
-    Removed constructor androidx.compose.ui.text.input.KeyboardCapitalization()
-RemovedMethod: androidx.compose.ui.text.input.KeyboardType#KeyboardType():
-    Removed constructor androidx.compose.ui.text.input.KeyboardType()
-RemovedMethod: androidx.compose.ui.text.style.BaselineShift#BaselineShift():
-    Removed constructor androidx.compose.ui.text.style.BaselineShift()
-RemovedMethod: androidx.compose.ui.text.style.TextAlign#TextAlign():
-    Removed constructor androidx.compose.ui.text.style.TextAlign()
-RemovedMethod: androidx.compose.ui.text.style.TextDirection#TextDirection():
-    Removed constructor androidx.compose.ui.text.style.TextDirection()
-RemovedMethod: androidx.compose.ui.text.style.TextOverflow#TextOverflow():
-    Removed constructor androidx.compose.ui.text.style.TextOverflow()
+DefaultValueChange: androidx.compose.ui.text.Paragraph#getLineEnd(int, boolean) parameter #1:
+    Attempted to remove default value from parameter visibleEnd in androidx.compose.ui.text.Paragraph.getLineEnd
+DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #1:
+    Attempted to remove default value from parameter color in androidx.compose.ui.text.Paragraph.paint
+DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #2:
+    Attempted to remove default value from parameter shadow in androidx.compose.ui.text.Paragraph.paint
+DefaultValueChange: androidx.compose.ui.text.Paragraph#paint(androidx.compose.ui.graphics.Canvas, long, androidx.compose.ui.graphics.Shadow, androidx.compose.ui.text.style.TextDecoration) parameter #3:
+    Attempted to remove default value from parameter textDecoration in androidx.compose.ui.text.Paragraph.paint
diff --git a/compose/ui/ui-text/api/restricted_current.txt b/compose/ui/ui-text/api/restricted_current.txt
index 0f4ee9f..060bf6e 100644
--- a/compose/ui/ui-text/api/restricted_current.txt
+++ b/compose/ui/ui-text/api/restricted_current.txt
@@ -4,7 +4,12 @@
   public final class ActualAtomicReferenceJvmKt {
   }
 
+  public final class AndroidParagraph_androidKt {
+  }
+
   public final class AndroidTextStyle_androidKt {
+    method public static androidx.compose.ui.text.PlatformParagraphStyle lerp(androidx.compose.ui.text.PlatformParagraphStyle start, androidx.compose.ui.text.PlatformParagraphStyle stop, float fraction);
+    method public static androidx.compose.ui.text.PlatformSpanStyle lerp(androidx.compose.ui.text.PlatformSpanStyle start, androidx.compose.ui.text.PlatformSpanStyle stop, float fraction);
   }
 
   @androidx.compose.runtime.Immutable public final class AnnotatedString implements java.lang.CharSequence {
@@ -153,7 +158,7 @@
   public final class MultiParagraphKt {
   }
 
-  @kotlin.jvm.JvmDefaultWithCompatibility public interface Paragraph {
+  public sealed interface Paragraph {
     method public androidx.compose.ui.text.style.ResolvedTextDirection getBidiRunDirection(int offset);
     method public androidx.compose.ui.geometry.Rect getBoundingBox(int offset);
     method public androidx.compose.ui.geometry.Rect getCursorRect(int offset);
@@ -164,7 +169,7 @@
     method public float getLastBaseline();
     method public float getLineBottom(int lineIndex);
     method public int getLineCount();
-    method public int getLineEnd(int lineIndex, optional boolean visibleEnd);
+    method public int getLineEnd(int lineIndex, boolean visibleEnd);
     method public int getLineForOffset(int offset);
     method public int getLineForVerticalPosition(float vertical);
     method public float getLineHeight(int lineIndex);
@@ -182,7 +187,7 @@
     method public float getWidth();
     method public long getWordBoundary(int offset);
     method public boolean isLineEllipsized(int lineIndex);
-    method public void paint(androidx.compose.ui.graphics.Canvas canvas, optional long color, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextDecoration? textDecoration);
+    method public void paint(androidx.compose.ui.graphics.Canvas canvas, long color, androidx.compose.ui.graphics.Shadow? shadow, androidx.compose.ui.text.style.TextDecoration? textDecoration);
     property public abstract boolean didExceedMaxLines;
     property public abstract float firstBaseline;
     property public abstract float height;
@@ -217,16 +222,22 @@
   }
 
   @androidx.compose.runtime.Immutable public final class ParagraphStyle {
+    ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     ctor public ParagraphStyle(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
     method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.ParagraphStyle copy(optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformParagraphStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public operator boolean equals(Object? other);
     method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getPlatformStyle();
     method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
     method public androidx.compose.ui.text.style.TextDirection? getTextDirection();
     method public androidx.compose.ui.text.style.TextIndent? getTextIndent();
     method @androidx.compose.runtime.Stable public androidx.compose.ui.text.ParagraphStyle merge(optional androidx.compose.ui.text.ParagraphStyle? other);
     method @androidx.compose.runtime.Stable public operator androidx.compose.ui.text.ParagraphStyle plus(androidx.compose.ui.text.ParagraphStyle other);
     property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? platformStyle;
     property public final androidx.compose.ui.text.style.TextAlign? textAlign;
     property public final androidx.compose.ui.text.style.TextDirection? textDirection;
     property public final androidx.compose.ui.text.style.TextIndent? textIndent;
@@ -269,12 +280,47 @@
     property public final int Top;
   }
 
+  public final class PlatformParagraphStyle {
+    ctor @Deprecated public PlatformParagraphStyle(optional boolean includeFontPadding);
+    method @Deprecated public boolean getIncludeFontPadding();
+    method public androidx.compose.ui.text.PlatformParagraphStyle merge(androidx.compose.ui.text.PlatformParagraphStyle? other);
+    property @Deprecated public final boolean includeFontPadding;
+    field public static final androidx.compose.ui.text.PlatformParagraphStyle.Companion Companion;
+  }
+
+  public static final class PlatformParagraphStyle.Companion {
+    method public androidx.compose.ui.text.PlatformParagraphStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle Default;
+  }
+
+  public final class PlatformSpanStyle {
+    ctor public PlatformSpanStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle merge(androidx.compose.ui.text.PlatformSpanStyle? other);
+    field public static final androidx.compose.ui.text.PlatformSpanStyle.Companion Companion;
+  }
+
+  public static final class PlatformSpanStyle.Companion {
+    method public androidx.compose.ui.text.PlatformSpanStyle getDefault();
+    property public final androidx.compose.ui.text.PlatformSpanStyle Default;
+  }
+
+  public final class PlatformTextStyle {
+    ctor public PlatformTextStyle(androidx.compose.ui.text.PlatformSpanStyle? spanStyle, androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle);
+    ctor @Deprecated public PlatformTextStyle(optional boolean includeFontPadding);
+    method public androidx.compose.ui.text.PlatformParagraphStyle? getParagraphStyle();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getSpanStyle();
+    property public final androidx.compose.ui.text.PlatformParagraphStyle? paragraphStyle;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? spanStyle;
+  }
+
   public final class SaversKt {
   }
 
   @androidx.compose.runtime.Immutable public final class SpanStyle {
     ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    ctor public SpanStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow);
+    method public androidx.compose.ui.text.SpanStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.PlatformSpanStyle? platformStyle);
     method public operator boolean equals(Object? other);
     method public long getBackground();
     method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
@@ -287,6 +333,7 @@
     method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
     method public long getLetterSpacing();
     method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformSpanStyle? getPlatformStyle();
     method public androidx.compose.ui.graphics.Shadow? getShadow();
     method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
     method public androidx.compose.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
@@ -303,6 +350,7 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
     property public final long letterSpacing;
     property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.text.PlatformSpanStyle? platformStyle;
     property public final androidx.compose.ui.graphics.Shadow? shadow;
     property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
     property public final androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform;
@@ -443,7 +491,9 @@
 
   @androidx.compose.runtime.Immutable public final class TextStyle {
     ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    ctor public TextStyle(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent);
+    method public androidx.compose.ui.text.TextStyle copy(optional long color, optional long fontSize, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontSynthesis? fontSynthesis, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional String? fontFeatureSettings, optional long letterSpacing, optional androidx.compose.ui.text.style.BaselineShift? baselineShift, optional androidx.compose.ui.text.style.TextGeometricTransform? textGeometricTransform, optional androidx.compose.ui.text.intl.LocaleList? localeList, optional long background, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.graphics.Shadow? shadow, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional androidx.compose.ui.text.style.TextDirection? textDirection, optional long lineHeight, optional androidx.compose.ui.text.style.TextIndent? textIndent, optional androidx.compose.ui.text.PlatformTextStyle? platformStyle, optional androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle);
     method public long getBackground();
     method public androidx.compose.ui.text.style.BaselineShift? getBaselineShift();
     method public long getColor();
@@ -455,7 +505,9 @@
     method public androidx.compose.ui.text.font.FontWeight? getFontWeight();
     method public long getLetterSpacing();
     method public long getLineHeight();
+    method public androidx.compose.ui.text.style.LineHeightStyle? getLineHeightStyle();
     method public androidx.compose.ui.text.intl.LocaleList? getLocaleList();
+    method public androidx.compose.ui.text.PlatformTextStyle? getPlatformStyle();
     method public androidx.compose.ui.graphics.Shadow? getShadow();
     method public androidx.compose.ui.text.style.TextAlign? getTextAlign();
     method public androidx.compose.ui.text.style.TextDecoration? getTextDecoration();
@@ -482,7 +534,9 @@
     property public final androidx.compose.ui.text.font.FontWeight? fontWeight;
     property public final long letterSpacing;
     property public final long lineHeight;
+    property public final androidx.compose.ui.text.style.LineHeightStyle? lineHeightStyle;
     property public final androidx.compose.ui.text.intl.LocaleList? localeList;
+    property public final androidx.compose.ui.text.PlatformTextStyle? platformStyle;
     property public final androidx.compose.ui.graphics.Shadow? shadow;
     property public final androidx.compose.ui.text.style.TextAlign? textAlign;
     property public final androidx.compose.ui.text.style.TextDecoration? textDecoration;
@@ -588,6 +642,9 @@
   public final class AndroidFontUtils_androidKt {
   }
 
+  public final class AndroidLoadableFontsKt {
+  }
+
   public final class AndroidTypeface_androidKt {
     method public static androidx.compose.ui.text.font.FontFamily FontFamily(android.graphics.Typeface typeface);
     method @Deprecated public static androidx.compose.ui.text.font.Typeface Typeface(android.content.Context context, androidx.compose.ui.text.font.FontFamily fontFamily, optional java.util.List<kotlin.Pair<androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontStyle>>? styles);
@@ -1225,6 +1282,50 @@
     method @androidx.compose.runtime.Stable public static float lerp(float start, float stop, float fraction);
   }
 
+  public final class LineHeightStyle {
+    ctor public LineHeightStyle(float alignment, int trim);
+    method public float getAlignment();
+    method public int getTrim();
+    property public final float alignment;
+    property public final int trim;
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Companion Companion;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Alignment {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Alignment.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Alignment.Companion {
+    method public float getBottom();
+    method public float getCenter();
+    method public float getProportional();
+    method public float getTop();
+    property public final float Bottom;
+    property public final float Center;
+    property public final float Proportional;
+    property public final float Top;
+  }
+
+  public static final class LineHeightStyle.Companion {
+    method public androidx.compose.ui.text.style.LineHeightStyle getDefault();
+    property public final androidx.compose.ui.text.style.LineHeightStyle Default;
+  }
+
+  @kotlin.jvm.JvmInline public static final value class LineHeightStyle.Trim {
+    field public static final androidx.compose.ui.text.style.LineHeightStyle.Trim.Companion Companion;
+  }
+
+  public static final class LineHeightStyle.Trim.Companion {
+    method public int getBoth();
+    method public int getFirstLineTop();
+    method public int getLastLineBottom();
+    method public int getNone();
+    property public final int Both;
+    property public final int FirstLineTop;
+    property public final int LastLineBottom;
+    property public final int None;
+  }
+
   public enum ResolvedTextDirection {
     method public static androidx.compose.ui.text.style.ResolvedTextDirection valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.compose.ui.text.style.ResolvedTextDirection[] values();
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
index 6d754cc8..c05380c 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphBenchmark.kt
@@ -52,7 +52,7 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0} type={1} alphabet={2}")
-        fun initParameters(): List<Array<Any>> = cartesian(
+        fun initParameters(): List<Array<Any?>> = cartesian(
             arrayOf(512),
             arrayOf(TextType.PlainText),
             arrayOf(Alphabet.Latin, Alphabet.Cjk)
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphWithLineHeightBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphWithLineHeightBenchmark.kt
new file mode 100644
index 0000000..9ac6a7a
--- /dev/null
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/ParagraphWithLineHeightBenchmark.kt
@@ -0,0 +1,139 @@
+/*
+ * 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.
+ */
+
+package androidx.compose.ui.text.benchmark
+
+import android.content.Context
+import android.util.TypedValue
+import androidx.benchmark.junit4.BenchmarkRule
+import androidx.benchmark.junit4.measureRepeated
+import androidx.compose.ui.text.Paragraph
+import androidx.compose.ui.text.ParagraphIntrinsics
+import androidx.compose.ui.text.PlatformTextStyle
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.createFontFamilyResolver
+import androidx.compose.ui.text.style.LineHeightStyle
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.sp
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import kotlin.math.ceil
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ParagraphWithLineHeightBenchmark(
+    private val textLength: Int,
+    private val addNewLine: Boolean,
+    private val applyLineHeight: Boolean,
+    private val lineHeightStyle: LineHeightStyle?
+) {
+    companion object {
+        @JvmStatic
+        @Parameterized.Parameters(
+            name = "length={0} newLine={1} applyLineHeight={2} lineHeightStyle={3}"
+        )
+        fun initParameters(): List<Array<Any?>> = cartesian(
+            arrayOf(16),
+            // add new line
+            arrayOf(true),
+            // apply line height
+            arrayOf(false, true),
+            arrayOf(LineHeightStyle.Default)
+        )
+    }
+
+    @get:Rule
+    val benchmarkRule = BenchmarkRule()
+
+    @get:Rule
+    val textBenchmarkRule = TextBenchmarkTestRule(Alphabet.Latin)
+
+    private lateinit var instrumentationContext: Context
+
+    // Width initialized in setup().
+    private var width: Float = 0f
+    private val fontSize = textBenchmarkRule.fontSizeSp.sp
+
+    @Before
+    fun setup() {
+        instrumentationContext = InstrumentationRegistry.getInstrumentation().context
+        width = TypedValue.applyDimension(
+            TypedValue.COMPLEX_UNIT_DIP,
+            textBenchmarkRule.widthDp,
+            instrumentationContext.resources.displayMetrics
+        )
+    }
+
+    private fun text(textGenerator: RandomTextGenerator): String {
+        return textGenerator.nextParagraph(textLength) + if (addNewLine) "\n" else ""
+    }
+
+    private fun paragraph(
+        text: String,
+        width: Float
+    ): Paragraph {
+        return Paragraph(
+            paragraphIntrinsics = paragraphIntrinsics(text),
+            constraints = Constraints(maxWidth = ceil(width).toInt())
+        )
+    }
+
+    private fun paragraphIntrinsics(text: String): ParagraphIntrinsics {
+        @Suppress("DEPRECATION")
+        val style = if (applyLineHeight) {
+            TextStyle(
+                fontSize = fontSize,
+                lineHeight = fontSize * 2,
+                lineHeightStyle = lineHeightStyle,
+                platformStyle = PlatformTextStyle(includeFontPadding = false)
+            )
+        } else {
+            TextStyle(
+                fontSize = fontSize,
+                lineHeightStyle = lineHeightStyle,
+                platformStyle = PlatformTextStyle(includeFontPadding = false)
+            )
+        }
+
+        return ParagraphIntrinsics(
+            text = text,
+            density = Density(density = instrumentationContext.resources.displayMetrics.density),
+            style = style,
+            fontFamilyResolver = createFontFamilyResolver(instrumentationContext)
+        )
+    }
+
+    @Test
+    fun construct() {
+        textBenchmarkRule.generator { textGenerator ->
+            benchmarkRule.measureRepeated {
+                val text = runWithTimingDisabled {
+                    // create a new paragraph and use a smaller width to get
+                    // some line breaking in the result
+                    text(textGenerator)
+                }
+
+                paragraph(text = text, width = width)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
index 9a08b973..5dbd7a9 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/TextMeasurerBenchmark.kt
@@ -55,7 +55,7 @@
     companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "length={0} type={1} alphabet={2}")
-        fun initParameters(): List<Array<Any>> = cartesian(
+        fun initParameters(): List<Array<Any?>> = cartesian(
             arrayOf(8, 32, 128, 512),
             arrayOf(TextType.PlainText, TextType.StyledText),
             arrayOf(Alphabet.Latin, Alphabet.Cjk)
diff --git a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt
index 1cf9583..d9549db 100644
--- a/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt
+++ b/compose/ui/ui-text/benchmark/src/androidTest/java/androidx/compose/ui/text/benchmark/input/EditProcessorBenchmark.kt
@@ -62,7 +62,7 @@
 
         @JvmStatic
         @Parameterized.Parameters(name = "initText={0}, senario={1}")
-        fun initParameters(): List<Array<Any>> = cartesian(
+        fun initParameters(): List<Array<Any?>> = cartesian(
             arrayOf(
                 InitialText(longText, "Long Text"),
                 InitialText(shortText, "Short Text")
diff --git a/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt b/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt
index b89c433..c83992d0 100644
--- a/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt
+++ b/compose/ui/ui-text/benchmark/src/main/java/androidx/compose/ui/text/benchmark/TextBenchmarkHelper.kt
@@ -218,7 +218,7 @@
 /**
  * Creates a cartesian product of the given arrays.
  */
-fun cartesian(vararg arrays: Array<Any>): List<Array<Any>> {
+fun cartesian(vararg arrays: Array<Any?>): List<Array<Any?>> {
     return arrays.fold(listOf(arrayOf())) { acc, list ->
         // add items from the current list
         // to each list that was accumulated
diff --git a/compose/ui/ui-text/build.gradle b/compose/ui/ui-text/build.gradle
index 2173042..7d15c34 100644
--- a/compose/ui/ui-text/build.gradle
+++ b/compose/ui/ui-text/build.gradle
@@ -40,15 +40,14 @@
         api("androidx.annotation:annotation:1.1.0")
 
         // when updating the runtime version please also update the runtime-saveable version
-        implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
-        implementation("androidx.compose.runtime:runtime-saveable:1.2.0-rc02")
+        implementation("androidx.compose.runtime:runtime:1.2.0")
+        implementation("androidx.compose.runtime:runtime-saveable:1.2.0")
 
         implementation(project(":compose:ui:ui-util"))
         implementation(libs.kotlinStdlib)
         implementation("androidx.core:core:1.7.0")
         implementation('androidx.collection:collection:1.0.0')
 
-        testImplementation(project(":internal-testutils-fonts"))
         testImplementation(libs.testRules)
         testImplementation(libs.testRunner)
         testImplementation(libs.junit)
@@ -124,6 +123,10 @@
                 dependsOn(jvmMain)
             }
 
+            androidMain {
+                dependsOn(commonMain)
+            }
+
             androidMain.dependencies {
                 api("androidx.annotation:annotation:1.1.0")
                 implementation("androidx.core:core:1.7.0")
@@ -168,7 +171,6 @@
                 implementation(libs.skikoCurrentOs)
                 implementation(project(":compose:foundation:foundation"))
                 implementation(project(":compose:ui:ui-test-junit4"))
-                implementation(project(":internal-testutils-fonts"))
             }
         }
     }
diff --git a/compose/ui/ui-text/lint-baseline.xml b/compose/ui/ui-text/lint-baseline.xml
index 84c081a..50cfa08 100644
--- a/compose/ui/ui-text/lint-baseline.xml
+++ b/compose/ui/ui-text/lint-baseline.xml
@@ -28,4 +28,481 @@
             file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TempListUtils.kt"/>
     </issue>
 
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="    @OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidFontListTypeface.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphHelper.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/BaselineShiftSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/BoringLayoutFactory.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/BoringLayoutFactory.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/FontFeatureSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutCompat.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutHelper.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/LayoutIntrinsics.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LetterSpacingSpanEm.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LetterSpacingSpanPx.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightStyleSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/PlaceholderExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/PlaceholderSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentBreaker.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/animation/SegmentType.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/ShadowSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/SkewXSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class, ExperimentalTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/StaticLayoutFactory.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/TextDecorationSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@OptIn(InternalPlatformTextApi::class)"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/style/TypefaceSpan.kt"/>
+    </issue>
+
+    <issue
+        id="NullAnnotationGroup"
+        message="Could not find associated group for annotation androidx.compose.ui.text.android.InternalPlatformTextApi, which is used in androidx.compose.ui."
+        errorLine1="@InternalPlatformTextApi"
+        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../../../text/text/src/main/java/androidx/compose/ui/text/android/selection/WordBoundary.kt"/>
+    </issue>
+
+    <issue
+        id="ListIterator"
+        message="Creating an unnecessary Iterator to iterate through a List"
+        errorLine1="        paragraphStyles.sortedBy { it.start }.fastForEach { paragraphStyle ->"
+        errorLine2="                        ~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt"/>
+    </issue>
+
+    <issue
+        id="ListIterator"
+        message="Creating an unnecessary Iterator to iterate through a List"
+        errorLine1="                        &quot;&apos;$key&apos; must be unique. Actual [ [${value.joinToString()}]&quot;"
+        errorLine2="                                                                  ~~~~~~~~~~~~">
+        <location
+            file="src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt"/>
+    </issue>
+
 </issues>
diff --git a/compose/ui/ui-text/samples/build.gradle b/compose/ui/ui-text/samples/build.gradle
index 70340cd..b8a3df5 100644
--- a/compose/ui/ui-text/samples/build.gradle
+++ b/compose/ui/ui-text/samples/build.gradle
@@ -31,7 +31,7 @@
 
     implementation("androidx.compose.foundation:foundation:1.0.0")
     implementation("androidx.compose.material:material:1.0.0")
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation(project(":compose:ui:ui"))
     implementation(project(":compose:ui:ui-text"))
 }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
similarity index 97%
rename from compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTest.kt
rename to compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
index c469f1b..b9e37ac 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTest.kt
@@ -1,4 +1,20 @@
-package androidx.compose.ui.text.platform
+/*
+ * 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
 
 import android.graphics.Paint
 import android.graphics.Typeface
@@ -18,13 +34,7 @@
 import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.SolidColor
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.FontTestData.Companion.BASIC_MEASURE_FONT
-import androidx.compose.ui.text.PlatformTextStyle
-import androidx.compose.ui.text.SpanStyle
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.UncachedFontFamilyResolver
 import androidx.compose.ui.text.android.InternalPlatformTextApi
 import androidx.compose.ui.text.android.TextLayout
 import androidx.compose.ui.text.android.style.BaselineShiftSpan
@@ -34,7 +44,6 @@
 import androidx.compose.ui.text.android.style.ShadowSpan
 import androidx.compose.ui.text.android.style.SkewXSpan
 import androidx.compose.ui.text.android.style.TextDecorationSpan
-import androidx.compose.ui.text.ceilToInt
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontWeight
@@ -43,6 +52,7 @@
 import androidx.compose.ui.text.font.toFontFamily
 import androidx.compose.ui.text.intl.LocaleList
 import androidx.compose.ui.text.matchers.assertThat
+import androidx.compose.ui.text.platform.bitmap
 import androidx.compose.ui.text.platform.style.ShaderBrushSpan
 import androidx.compose.ui.text.style.BaselineShift
 import androidx.compose.ui.text.style.TextAlign
@@ -1091,6 +1101,28 @@
     }
 
     @Test
+    fun testEllipsis_whenHeightAllowsForZeroLines_doesEllipsis() {
+        with(defaultDensity) {
+            val text = "This is a text"
+            val fontSize = 30.sp
+            val paragraph = simpleParagraph(
+                text = text,
+                ellipsis = true,
+                style = TextStyle(
+                    fontFamily = basicFontFamily,
+                    fontSize = fontSize
+                ),
+                width = 4 * fontSize.toPx(),
+                height = fontSize.toPx() / 4
+            )
+
+            assertThat(paragraph.didExceedMaxLines).isTrue()
+            assertThat(paragraph.lineCount).isEqualTo(1)
+            assertThat(paragraph.isEllipsisApplied(paragraph.lineCount - 1)).isTrue()
+        }
+    }
+
+    @Test
     fun testEllipsis_withSpans_withLimitedHeight_doesEllipsis() {
         with(defaultDensity) {
             val text = "This is a text"
@@ -1113,7 +1145,6 @@
             assertThat(paragraph.isEllipsisApplied(paragraph.lineCount - 1)).isTrue()
         }
     }
-
     @Test
     fun testSpanStyle_fontSize_appliedOnTextPaint() {
         with(defaultDensity) {
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTextDirectionTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTextDirectionTest.kt
similarity index 96%
rename from compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTextDirectionTest.kt
rename to compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTextDirectionTest.kt
index 02a4bda..c9dcbb7 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/AndroidParagraphTextDirectionTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidParagraphTextDirectionTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 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.
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.text.platform
+package androidx.compose.ui.text
 
 import androidx.compose.ui.text.android.InternalPlatformTextApi
 import androidx.compose.ui.text.android.LayoutCompat
 import androidx.compose.ui.text.intl.LocaleList
+import androidx.compose.ui.text.platform.resolveTextDirectionHeuristics
 import androidx.compose.ui.text.style.TextDirection
 import androidx.test.filters.SmallTest
 import com.google.common.truth.Truth.assertThat
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidPargraphExt.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidPargraphExt.kt
new file mode 100644
index 0000000..a76fc2b
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/AndroidPargraphExt.kt
@@ -0,0 +1,31 @@
+/*
+ * 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
+
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import kotlin.math.ceil
+
+internal fun AndroidParagraph.bitmap(): Bitmap {
+    val bitmap = Bitmap.createBitmap(
+        ceil(this.width).toInt(),
+        ceil(this.height).toInt(),
+        Bitmap.Config.ARGB_8888
+    )
+    this.paint(androidx.compose.ui.graphics.Canvas(Canvas(bitmap)))
+    return bitmap
+}
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
index 0c6493a..9bda6c1 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
@@ -27,7 +27,6 @@
 import androidx.compose.ui.text.intl.LocaleList
 import androidx.compose.ui.text.matchers.assertThat
 import androidx.compose.ui.text.matchers.isZero
-import androidx.compose.ui.text.platform.AndroidParagraph
 import androidx.compose.ui.text.style.ResolvedTextDirection
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextDirection
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt
index ea15b16..ea4fad9 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphFillBoundingBoxesTest.kt
@@ -19,7 +19,6 @@
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.text.font.createFontFamilyResolver
 import androidx.compose.ui.text.font.toFontFamily
-import androidx.compose.ui.text.platform.AndroidParagraph
 import androidx.compose.ui.text.style.BaselineShift
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextDirection
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt
index 6b4b6d0..ddef649 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationLineHeightStyleTest.kt
@@ -19,7 +19,6 @@
 import android.graphics.Paint.FontMetricsInt
 import androidx.compose.ui.text.android.style.lineHeight
 import androidx.compose.ui.text.font.toFontFamily
-import androidx.compose.ui.text.platform.AndroidParagraph
 import androidx.compose.ui.text.style.LineHeightStyle
 import androidx.compose.ui.text.style.LineHeightStyle.Trim
 import androidx.compose.ui.text.style.LineHeightStyle.Alignment
@@ -840,11 +839,55 @@
         }
     }
 
+    @Test
+    fun lastLineEmptyTextHasSameLineHeightAsNonEmptyText() {
+        assertEmptyLineMetrics("", "a")
+        assertEmptyLineMetrics("\n", "a\na")
+        assertEmptyLineMetrics("a\n", "a\na")
+        assertEmptyLineMetrics("\na", "a\na")
+        assertEmptyLineMetrics("\na\na", "a\na\na")
+        assertEmptyLineMetrics("a\na\n", "a\na\na")
+    }
+
+    private fun assertEmptyLineMetrics(textWithEmptyLine: String, textWithoutEmptyLine: String) {
+        val textStyle = TextStyle(
+            lineHeightStyle = LineHeightStyle(
+                trim = Trim.None,
+                alignment = Alignment.Proportional
+            ),
+            platformStyle = @Suppress("DEPRECATION") PlatformTextStyle(
+                includeFontPadding = false
+            )
+        )
+
+        val paragraphWithEmptyLastLine = simpleParagraph(
+            text = textWithEmptyLine,
+            style = textStyle
+        ) as AndroidParagraph
+
+        val otherParagraph = simpleParagraph(
+            text = textWithoutEmptyLine,
+            style = textStyle
+        ) as AndroidParagraph
+
+        with(paragraphWithEmptyLastLine) {
+            for (line in 0 until lineCount) {
+                assertThat(height).isEqualTo(otherParagraph.height)
+                assertThat(getLineTop(line)).isEqualTo(otherParagraph.getLineTop(line))
+                assertThat(getLineBottom(line)).isEqualTo(otherParagraph.getLineBottom(line))
+                assertThat(getLineHeight(line)).isEqualTo(otherParagraph.getLineHeight(line))
+                assertThat(getLineAscent(line)).isEqualTo(otherParagraph.getLineAscent(line))
+                assertThat(getLineDescent(line)).isEqualTo(otherParagraph.getLineDescent(line))
+                assertThat(getLineBaseline(line)).isEqualTo(otherParagraph.getLineBaseline(line))
+            }
+        }
+    }
+
     private fun singleLineParagraph(
         lineHeightTrim: Trim,
         lineHeightAlignment: Alignment,
+        text: String = "AAA"
     ): AndroidParagraph {
-        val text = "AAA"
         val textStyle = TextStyle(
             lineHeightStyle = LineHeightStyle(
                 trim = lineHeightTrim,
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
index a3063eb..ad9ba5a 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
@@ -36,7 +36,6 @@
 import androidx.compose.ui.text.intl.LocaleList
 import androidx.compose.ui.text.matchers.assertThat
 import androidx.compose.ui.text.matchers.isZero
-import androidx.compose.ui.text.platform.AndroidParagraph
 import androidx.compose.ui.text.style.ResolvedTextDirection
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextDirection
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
index 591c6c0..d86c792 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/TextPainterTest.kt
@@ -358,6 +358,39 @@
     }
 
     @Test
+    fun drawTextClipsTheContent_ifOverflowIsEllipsis_ifLessThanOneLineFits() {
+        val measurer = textMeasurer()
+        with(defaultDensity) {
+            val fontSize = 20.sp
+            val height = fontSize.toPx().ceilToInt() / 2
+            val textLayoutResult = measurer.measure(
+                text = longText,
+                style = TextStyle(
+                    fontFamily = fontFamilyMeasureFont,
+                    fontSize = fontSize
+                ),
+                softWrap = false,
+                overflow = TextOverflow.Ellipsis,
+                size = IntSize(200, height)
+            )
+
+            val bitmap = draw(200f, 200f) {
+                drawText(textLayoutResult)
+            }
+            val croppedBitmap = Bitmap.createBitmap(bitmap, 0, height, 200, 200 - height)
+
+            // cropped part should be empty
+            assertThat(croppedBitmap).isEqualToBitmap(
+                Bitmap.createBitmap(
+                    200,
+                    200 - height,
+                    Bitmap.Config.ARGB_8888
+                )
+            )
+        }
+    }
+
+    @Test
     fun drawTextDoesNotClipTheContent_ifOverflowIsVisible() {
         val measurer = textMeasurer()
         // constrain the width, height is ignored
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt
index 6723fbe..1a0cd49 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidFontTest.kt
@@ -36,9 +36,9 @@
 @RunWith(AndroidJUnit4::class)
 @OptIn(ExperimentalTextApi::class)
 class AndroidFontTest {
+    private var tempFile: File? = null
     private val context = InstrumentationRegistry.getInstrumentation().context
     private val assetFontPath = "subdirectory/asset_font.ttf"
-    private val tmpFontPath = "tmp_file_font.ttf"
 
     @Before
     fun setup() {
@@ -52,16 +52,16 @@
     }
 
     private fun deleteFile() {
-        val fontFile = File(context.filesDir, tmpFontPath)
-        if (fontFile.exists()) {
-            fontFile.delete()
+        if (tempFile?.exists() == true) {
+            tempFile?.delete()
         }
     }
 
     private fun writeFile() {
+        tempFile = File.createTempFile("tmp_file_font", ".ttf", context.filesDir)
         context.assets.open(assetFontPath).use { input ->
             val bytes = input.readBytes()
-            context.openFileOutput(tmpFontPath, Context.MODE_PRIVATE).use { output ->
+            context.openFileOutput(tempFile?.name, Context.MODE_PRIVATE).use { output ->
                 output.write(bytes)
             }
         }
@@ -121,8 +121,7 @@
     }
 
     private fun makeFileFont(): AndroidFont {
-        val fontFile = File(context.filesDir, tmpFontPath)
-        return Font(file = fontFile) as AndroidFont
+        return Font(tempFile!!) as AndroidFont
     }
 
     @Test
@@ -164,7 +163,7 @@
 
     @RequiresApi(Build.VERSION_CODES.O)
     private fun makeFileDescriptorFont(): AndroidFont {
-        return context.openFileInput(tmpFontPath).use { inputStream ->
+        return context.openFileInput(tempFile?.name).use { inputStream ->
             Font(ParcelFileDescriptor.dup(inputStream.fd)) as AndroidFont
         }
     }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidVariableFontTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidVariableFontTest.kt
new file mode 100644
index 0000000..5de107fd
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/AndroidVariableFontTest.kt
@@ -0,0 +1,201 @@
+/*
+ * 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.compose.ui.text.font
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Typeface
+import android.os.ParcelFileDescriptor
+import android.text.TextPaint
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import java.io.File
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalTextApi::class)
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class AndroidVariableFontTest {
+    private var tempFile: File? = null
+    private val context = InstrumentationRegistry.getInstrumentation().context
+    private val assetFontPath = "subdirectory/asset_variable_font.ttf"
+
+    @Before
+    fun setup() {
+        deleteFile()
+        writeFile()
+    }
+
+    @After
+    fun cleanupAfter() {
+        deleteFile()
+    }
+
+    private fun deleteFile() {
+        if (tempFile?.exists() == true) {
+            tempFile?.delete()
+        }
+    }
+
+    private fun writeFile() {
+        tempFile = File.createTempFile("tmp_file_font", ".ttf", context.filesDir)
+        context.assets.open(assetFontPath).use { input ->
+            val bytes = input.readBytes()
+            context.openFileOutput(tempFile?.name, Context.MODE_PRIVATE).use { output ->
+                output.write(bytes)
+            }
+        }
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun fileFont_differentFontVariationSettings_differentResults() {
+        val font1 = Font(
+            file = tempFile!!,
+            variationSettings = FontVariation.Settings(FontVariation.weight(1))
+        ) as AndroidFont
+        val font1000 = Font(
+            file = tempFile!!,
+            variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+        ) as AndroidFont
+
+        val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
+        val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
+        assertThat(bitmap1.sameAs(bitmap2)).isFalse()
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun fontFile_defaultsWeight_whenWeightSet() {
+        val font1 = Font(
+            file = tempFile!!,
+            weight = FontWeight(1)
+        ) as AndroidFont
+        val font1000 = Font(
+            file = tempFile!!,
+            weight = FontWeight(1000)
+        ) as AndroidFont
+
+        val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
+        val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
+        assertThat(bitmap1.sameAs(bitmap2)).isFalse()
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun assetFont_differentFontVariationSettings_differentResults() {
+        val font1 = Font(
+            path = assetFontPath,
+            context.assets,
+            variationSettings = FontVariation.Settings(FontVariation.weight(1))
+        ) as AndroidFont
+        val font1000 = Font(
+            path = assetFontPath,
+            context.assets,
+            variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+        ) as AndroidFont
+
+        val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
+        val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
+        assertThat(bitmap1.sameAs(bitmap2)).isFalse()
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun assetFile_defaultsWeight_whenWeightSet() {
+        val font1 = Font(
+            path = assetFontPath,
+            context.assets,
+            weight = FontWeight(1)
+        ) as AndroidFont
+        val font1000 = Font(
+            path = assetFontPath,
+            context.assets,
+            weight = FontWeight(1000)
+        ) as AndroidFont
+
+        val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
+        val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
+        assertThat(bitmap1.sameAs(bitmap2)).isFalse()
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun parcelFont_differentFontVariationSettings_differentResults() {
+        val font1 = context.openFileInput(tempFile?.name).use { inputStream ->
+            Font(
+                ParcelFileDescriptor.dup(inputStream.fd),
+                variationSettings = FontVariation.Settings(FontVariation.weight(1))
+            ) as AndroidFont
+        }
+        val font1000 = context.openFileInput(tempFile?.name).use { inputStream ->
+            Font(
+                ParcelFileDescriptor.dup(inputStream.fd),
+                variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+            ) as AndroidFont
+        }
+
+        val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
+        val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
+        assertThat(bitmap1.sameAs(bitmap2)).isFalse()
+    }
+
+    @Test
+    @SdkSuppress(minSdkVersion = 26)
+    fun parcelFile_defaultsWeight_whenWeightSet() {
+        val font1 = context.openFileInput(tempFile?.name).use { inputStream ->
+            Font(
+                ParcelFileDescriptor.dup(inputStream.fd),
+                variationSettings = FontVariation.Settings(FontVariation.weight(1))
+            ) as AndroidFont
+        }
+        val font1000 = context.openFileInput(tempFile?.name).use { inputStream ->
+            Font(
+                ParcelFileDescriptor.dup(inputStream.fd),
+                variationSettings = FontVariation.Settings(FontVariation.weight(1000))
+            ) as AndroidFont
+        }
+
+        val bitmap1 = font1.typefaceLoader.loadBlocking(context, font1)!!.drawToBitmap("A")
+        val bitmap2 = font1000.typefaceLoader.loadBlocking(context, font1000)!!.drawToBitmap("A")
+        assertThat(bitmap1.sameAs(bitmap2)).isFalse()
+    }
+}
+
+private fun Typeface.drawToBitmap(s: String): Bitmap {
+    val tp = TextPaint()
+    tp.color = Color.WHITE
+    tp.bgColor = Color.YELLOW
+    tp.textSize = 25f
+    tp.typeface = this
+    tp.hinting = TextPaint.HINTING_OFF
+    tp.isAntiAlias = false
+    val bitmap = Bitmap.createBitmap(30, 30, Bitmap.Config.ARGB_8888)
+    val canvas = Canvas(bitmap)
+    canvas.drawRect(0f, 0f, 30f, 30f, tp)
+    tp.color = Color.BLUE
+    canvas.drawText(s, 0f, 20f, tp)
+    return bitmap
+}
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt
index e62f767..01d7dad 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/FontFamilyResolverImplTest.kt
@@ -468,7 +468,11 @@
             }
         }
         val fontFamily = FontFamily(
-            object : AndroidFont(FontLoadingStrategy.Blocking, unstableLoader) {
+            object : AndroidFont(
+                FontLoadingStrategy.Blocking,
+                unstableLoader,
+                FontVariation.Settings()
+            ) {
                 override val weight: FontWeight = FontWeight.Normal
                 override val style: FontStyle = FontStyle.Normal
             }
@@ -495,14 +499,12 @@
     }
 
     @Test(expected = IllegalStateException::class)
-    @OptIn(ExperimentalTextApi::class)
     fun throwsExceptionIfFontIsNotIncludedInTheApp() {
         val fontFamily = FontFamily(Font(resId = -1))
         resolveAsTypeface(fontFamily)
     }
 
     @Test(expected = IllegalStateException::class)
-    @OptIn(ExperimentalTextApi::class)
     fun throwsExceptionIfFontIsNotReadable() {
         val fontFamily = FontFamily(FontTestData.FONT_INVALID)
         resolveAsTypeface(fontFamily)
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt
index c7aea13..e6b6a47 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/testutils/AsyncTestFonts.kt
@@ -18,12 +18,14 @@
 
 import android.content.Context
 import android.graphics.Typeface
+import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.font.AndroidFont
 import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontLoadingStrategy.Companion.Async
 import androidx.compose.ui.text.font.FontLoadingStrategy.Companion.Blocking
 import androidx.compose.ui.text.font.FontLoadingStrategy.Companion.OptionalLocal
 import androidx.compose.ui.text.font.FontStyle
+import androidx.compose.ui.text.font.FontVariation
 import androidx.compose.ui.text.font.FontWeight
 import com.google.common.truth.Truth
 import kotlinx.coroutines.CompletableDeferred
@@ -131,36 +133,39 @@
     }
 }
 
+@OptIn(ExperimentalTextApi::class)
 class AsyncFauxFont(
     typefaceLoader: AsyncTestTypefaceLoader,
     override val weight: FontWeight = FontWeight.Normal,
     override val style: FontStyle = FontStyle.Normal,
-    val name: String = "AsyncFauxFont"
-) : AndroidFont(Async, typefaceLoader) {
+    private val name: String = "AsyncFauxFont"
+) : AndroidFont(Async, typefaceLoader, FontVariation.Settings(weight, style)) {
     override fun toString(): String {
         return "$name[$weight, $style]"
     }
 }
 
+@OptIn(ExperimentalTextApi::class)
 class OptionalFauxFont(
     typefaceLoader: AsyncTestTypefaceLoader,
     internal val typeface: Typeface?,
     override val weight: FontWeight = FontWeight.Normal,
     override val style: FontStyle = FontStyle.Normal,
-    val name: String = "OptionalFauxFont"
-) : AndroidFont(OptionalLocal, typefaceLoader) {
+    private val name: String = "OptionalFauxFont"
+) : AndroidFont(OptionalLocal, typefaceLoader, FontVariation.Settings(weight, style)) {
     override fun toString(): String {
         return "$name[$weight, $style]"
     }
 }
 
+@OptIn(ExperimentalTextApi::class)
 class BlockingFauxFont(
     typefaceLoader: AsyncTestTypefaceLoader,
     internal val typeface: Typeface,
     override val weight: FontWeight = FontWeight.Normal,
     override val style: FontStyle = FontStyle.Normal,
-    val name: String = "BlockingFauxFont"
-) : AndroidFont(Blocking, typefaceLoader) {
+    private val name: String = "BlockingFauxFont"
+) : AndroidFont(Blocking, typefaceLoader, FontVariation.Settings(weight, style)) {
     override fun toString(): String {
         return "$name[$weight, $style]"
     }
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt
index e44a54d..ab1625f 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/platform/TextTestExtensions.kt
@@ -23,17 +23,6 @@
 import android.text.TextPaint
 import androidx.compose.ui.text.android.InternalPlatformTextApi
 import androidx.compose.ui.text.android.TextLayout
-import kotlin.math.ceil
-
-internal fun AndroidParagraph.bitmap(): Bitmap {
-    val bitmap = Bitmap.createBitmap(
-        ceil(this.width).toInt(),
-        ceil(this.height).toInt(),
-        Bitmap.Config.ARGB_8888
-    )
-    this.paint(androidx.compose.ui.graphics.Canvas(Canvas(bitmap)))
-    return bitmap
-}
 
 fun Layout.bitmap(): Bitmap {
     val bitmap = Bitmap.createBitmap(
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
similarity index 87%
rename from compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraph.android.kt
rename to compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
index 869b39e..29360d2 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright 2018 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.
@@ -14,8 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.compose.ui.text.platform
+package androidx.compose.ui.text
 
+import java.util.Locale as JavaLocale
 import android.text.Spanned
 import android.text.TextUtils
 import androidx.annotation.VisibleForTesting
@@ -29,13 +30,6 @@
 import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.asComposePath
 import androidx.compose.ui.graphics.nativeCanvas
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.Paragraph
-import androidx.compose.ui.text.ParagraphIntrinsics
-import androidx.compose.ui.text.Placeholder
-import androidx.compose.ui.text.SpanStyle
-import androidx.compose.ui.text.TextRange
-import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.android.InternalPlatformTextApi
 import androidx.compose.ui.text.android.LayoutCompat.ALIGN_CENTER
 import androidx.compose.ui.text.android.LayoutCompat.ALIGN_LEFT
@@ -49,18 +43,17 @@
 import androidx.compose.ui.text.android.TextLayout
 import androidx.compose.ui.text.android.selection.WordBoundary
 import androidx.compose.ui.text.android.style.PlaceholderSpan
-import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
-import androidx.compose.ui.text.font.createFontFamilyResolver
+import androidx.compose.ui.text.platform.AndroidParagraphIntrinsics
+import androidx.compose.ui.text.platform.AndroidTextPaint
+import androidx.compose.ui.text.platform.isIncludeFontPaddingEnabled
 import androidx.compose.ui.text.platform.style.ShaderBrushSpan
 import androidx.compose.ui.text.style.ResolvedTextDirection
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextDecoration
-import androidx.compose.ui.unit.Density
-import java.util.Locale as JavaLocale
-import androidx.compose.ui.text.ExperimentalTextApi
-import androidx.compose.ui.text.ceilToInt
 import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import kotlin.math.min
 
 /**
  * Android specific implementation for [Paragraph]
@@ -136,12 +129,16 @@
         if (ellipsis && firstLayout.height > constraints.maxHeight && maxLines > 1) {
             val calculatedMaxLines =
                 firstLayout.numberOfLinesThatFitMaxHeight(constraints.maxHeight)
-            layout = if (calculatedMaxLines > 0 && calculatedMaxLines != maxLines) {
+            layout = if (calculatedMaxLines >= 0 && calculatedMaxLines != maxLines) {
                 constructTextLayout(
                     alignment = alignment,
                     justificationMode = justificationMode,
                     ellipsize = ellipsize,
-                    maxLines = calculatedMaxLines
+                    // When we can't fully fit even a single line, measure with one line anyway.
+                    // This will allow to have an ellipsis on that single line. If we measured with
+                    // 0 maxLines, it would measure all lines with no ellipsis even though the first
+                    // line might be partially visible
+                    maxLines = calculatedMaxLines.coerceAtLeast(1)
                 )
             } else {
                 firstLayout
@@ -187,6 +184,10 @@
     internal val textLocale: JavaLocale
         get() = paragraphIntrinsics.textPaint.textLocale
 
+    /**
+     * Resolved line count. If maxLines smaller than the real number of lines in the text, this
+     * property will return the minimum between the two
+     */
     override val lineCount: Int
         get() = layout.lineCount
 
@@ -495,72 +496,4 @@
         if (getLineBottom(lineIndex) > maxHeight) return lineIndex
     }
     return lineCount
-}
-
-@Suppress("DEPRECATION")
-@Deprecated(
-    "Font.ResourceLoader is deprecated, instead pass FontFamily.Resolver",
-    replaceWith = ReplaceWith(
-        "ActualParagraph(text, style, spanStyles, placeholders, " +
-            "maxLines, ellipsis, width, density, fontFamilyResolver)"
-    ),
-)
-internal actual fun ActualParagraph(
-    text: String,
-    style: TextStyle,
-    spanStyles: List<AnnotatedString.Range<SpanStyle>>,
-    placeholders: List<AnnotatedString.Range<Placeholder>>,
-    maxLines: Int,
-    ellipsis: Boolean,
-    width: Float,
-    density: Density,
-    @Suppress("DEPRECATION") resourceLoader: Font.ResourceLoader
-): Paragraph = AndroidParagraph(
-    AndroidParagraphIntrinsics(
-        text = text,
-        style = style,
-        placeholders = placeholders,
-        spanStyles = spanStyles,
-        fontFamilyResolver = createFontFamilyResolver(resourceLoader),
-        density = density
-    ),
-    maxLines,
-    ellipsis,
-    Constraints(maxWidth = width.ceilToInt())
-)
-
-internal actual fun ActualParagraph(
-    text: String,
-    style: TextStyle,
-    spanStyles: List<AnnotatedString.Range<SpanStyle>>,
-    placeholders: List<AnnotatedString.Range<Placeholder>>,
-    maxLines: Int,
-    ellipsis: Boolean,
-    constraints: Constraints,
-    density: Density,
-    fontFamilyResolver: FontFamily.Resolver
-): Paragraph = AndroidParagraph(
-    AndroidParagraphIntrinsics(
-        text = text,
-        style = style,
-        placeholders = placeholders,
-        spanStyles = spanStyles,
-        fontFamilyResolver = fontFamilyResolver,
-        density = density
-    ),
-    maxLines,
-    ellipsis,
-    constraints
-)
-
-internal actual fun ActualParagraph(
-    paragraphIntrinsics: ParagraphIntrinsics,
-    maxLines: Int,
-    ellipsis: Boolean,
-    constraints: Constraints
-): Paragraph = AndroidParagraph(
-    paragraphIntrinsics as AndroidParagraphIntrinsics,
-    maxLines,
-    ellipsis,
-    constraints
-)
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt
index e76a56b..b4e96c3 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidTextStyle.android.kt
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-@file:OptIn(ExperimentalTextApi::class)
-
 package androidx.compose.ui.text
 
 internal const val DefaultIncludeFontPadding = true
@@ -23,7 +21,6 @@
 /**
  * Provides Android specific [TextStyle] configuration options for styling and compatibility.
  */
-@ExperimentalTextApi
 actual class PlatformTextStyle {
     /**
      * Android specific text span styling and compatibility configuration.
@@ -105,7 +102,6 @@
  * Provides Android specific [ParagraphStyle] configuration options for styling and compatibility.
  */
 @Suppress("DEPRECATION")
-@ExperimentalTextApi
 actual class PlatformParagraphStyle {
     actual companion object {
         actual val Default: PlatformParagraphStyle =
@@ -150,7 +146,6 @@
 /**
  * Provides Android specific [SpanStyle] configuration options for styling and compatibility.
  */
-@ExperimentalTextApi
 actual class PlatformSpanStyle {
     actual companion object {
         actual val Default: PlatformSpanStyle = PlatformSpanStyle()
@@ -190,7 +185,6 @@
  * 1.0, so negative values and values greater than 1.0 are valid.
  */
 @Suppress("DEPRECATION")
-@ExperimentalTextApi
 actual fun lerp(
     start: PlatformParagraphStyle,
     stop: PlatformParagraphStyle,
@@ -220,7 +214,6 @@
  * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
  * 1.0, so negative values and values greater than 1.0 are valid.
  */
-@ExperimentalTextApi
 actual fun lerp(
     start: PlatformSpanStyle,
     stop: PlatformSpanStyle,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
new file mode 100644
index 0000000..7661837
--- /dev/null
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
@@ -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.compose.ui.text
+
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Path
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.text.style.ResolvedTextDirection
+import androidx.compose.ui.text.style.TextDecoration
+
+actual sealed interface Paragraph {
+    actual val width: Float
+    actual val height: Float
+    actual val minIntrinsicWidth: Float
+    actual val maxIntrinsicWidth: Float
+    actual val firstBaseline: Float
+    actual val lastBaseline: Float
+    actual val didExceedMaxLines: Boolean
+    actual val lineCount: Int
+    actual val placeholderRects: List<Rect?>
+    actual fun getPathForRange(start: Int, end: Int): Path
+    actual fun getCursorRect(offset: Int): Rect
+    actual fun getLineLeft(lineIndex: Int): Float
+    actual fun getLineRight(lineIndex: Int): Float
+    actual fun getLineTop(lineIndex: Int): Float
+    actual fun getLineBottom(lineIndex: Int): Float
+    actual fun getLineHeight(lineIndex: Int): Float
+    actual fun getLineWidth(lineIndex: Int): Float
+    actual fun getLineStart(lineIndex: Int): Int
+    actual fun getLineEnd(lineIndex: Int, visibleEnd: Boolean): Int
+    actual fun isLineEllipsized(lineIndex: Int): Boolean
+    actual fun getLineForOffset(offset: Int): Int
+    actual fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float
+    actual fun getParagraphDirection(offset: Int): ResolvedTextDirection
+    actual fun getBidiRunDirection(offset: Int): ResolvedTextDirection
+    actual fun getLineForVerticalPosition(vertical: Float): Int
+    actual fun getOffsetForPosition(position: Offset): Int
+    actual fun getBoundingBox(offset: Int): Rect
+    actual fun getWordBoundary(offset: Int): TextRange
+    actual fun paint(canvas: Canvas, color: Color, shadow: Shadow?, textDecoration: TextDecoration?)
+    @ExperimentalTextApi
+    actual fun paint(
+        canvas: Canvas,
+        brush: Brush,
+        alpha: Float,
+        shadow: Shadow?,
+        textDecoration: TextDecoration?
+    )
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
index a7dd397..4582e7b 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidFont.kt
@@ -17,99 +17,8 @@
 package androidx.compose.ui.text.font
 
 import android.content.Context
-import android.content.res.AssetManager
 import android.graphics.Typeface
-import android.os.Build
-import android.os.ParcelFileDescriptor
-import androidx.annotation.DoNotInline
-import androidx.annotation.RequiresApi
-import androidx.compose.runtime.Stable
 import androidx.compose.ui.text.ExperimentalTextApi
-import androidx.compose.ui.text.font.FontLoadingStrategy.Companion.Blocking
-import java.io.File
-
-/**
- * Create a Font declaration from a file in the assets directory. The content of the [File] is
- * read during construction.
- *
- * @param assetManager Android AssetManager
- * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
- * assets/dir/myfont.ttf).
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- */
-@ExperimentalTextApi
-@Stable
-@Deprecated("This experimental Font is replaced by Font(path, assetManager, ...)",
-    replaceWith = ReplaceWith("Font(path, assetManager, weight, style)"),
-    level = DeprecationLevel.WARNING
-)
-fun Font(
-    assetManager: AssetManager,
-    path: String,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal
-): Font = AndroidAssetFont(assetManager, path, weight, style)
-
-/**
- * Create a Font declaration from a file in the assets directory. The content of the [File] is
- * read during construction.
- *
- * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
- * assets/dir/myfont.ttf).
- * @param assetManager Android AssetManager
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- */
-@ExperimentalTextApi
-@Stable
-fun Font(
-    path: String,
-    assetManager: AssetManager,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal
-): Font = AndroidAssetFont(assetManager, path, weight, style)
-
-/**
- * Create a Font declaration from a file. The content of the [File] is read during construction.
- *
- * @param file the font file.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- */
-@ExperimentalTextApi
-@Stable
-@Suppress("StreamFiles")
-fun Font(
-    file: File,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal
-): Font = AndroidFileFont(file, weight, style)
-
-/**
- * Create a Font declaration from a [ParcelFileDescriptor]. The content of the
- * [ParcelFileDescriptor] is read during construction.
- *
- * @param fileDescriptor the file descriptor for the font file.
- * @param weight The weight of the font. The system uses this to match a font to a font request
- * that is given in a [androidx.compose.ui.text.SpanStyle].
- * @param style The style of the font, normal or italic. The system uses this to match a font to a
- * font request that is given in a [androidx.compose.ui.text.SpanStyle].
- */
-@RequiresApi(26)
-@ExperimentalTextApi
-@Stable
-fun Font(
-    fileDescriptor: ParcelFileDescriptor,
-    weight: FontWeight = FontWeight.Normal,
-    style: FontStyle = FontStyle.Normal
-): Font = AndroidFileDescriptorFont(fileDescriptor, weight, style)
 
 /**
  * Font for use on Android.
@@ -148,11 +57,26 @@
  * @param typefaceLoader a loader that knows how to load this [AndroidFont], may be shared between
  * several fonts
  */
-abstract class AndroidFont @OptIn(ExperimentalTextApi::class) constructor(
+abstract class AndroidFont
+@ExperimentalTextApi
+constructor(
     final override val loadingStrategy: FontLoadingStrategy,
-    val typefaceLoader: TypefaceLoader
+    val typefaceLoader: TypefaceLoader,
+    variationSettings: FontVariation.Settings,
 ) : Font {
 
+    @OptIn(ExperimentalTextApi::class)
+    // TODO(b/241016309) deprecate this once FontVariation is non-experimental
+    constructor(
+        loadingStrategy: FontLoadingStrategy,
+        typefaceLoader: TypefaceLoader,
+    ) : this(loadingStrategy, typefaceLoader, FontVariation.Settings())
+
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
+    @ExperimentalTextApi
+    @get:ExperimentalTextApi
+    val variationSettings: FontVariation.Settings = variationSettings
+
     /**
      * Loader for loading an [AndroidFont] and producing an [android.graphics.Typeface].
      *
@@ -233,88 +157,5 @@
     }
 }
 
-internal abstract class AndroidPreloadedFont : AndroidFont(
-    Blocking,
-    AndroidPreloadedFontTypefaceLoader
-) {
-    abstract val typefaceInternal: Typeface?
-    abstract val cacheKey: String?
-}
-
-private object AndroidPreloadedFontTypefaceLoader : AndroidFont.TypefaceLoader {
-    override fun loadBlocking(context: Context, font: AndroidFont): Typeface? =
-        (font as? AndroidPreloadedFont)?.typefaceInternal
-
-    override suspend fun awaitLoad(context: Context, font: AndroidFont): Nothing {
-        throw UnsupportedOperationException("All preloaded fonts are blocking.")
-    }
-}
-
-private class AndroidAssetFont constructor(
-    @Suppress("CanBeParameter") val assetManager: AssetManager,
-    val path: String,
-    override val weight: FontWeight = FontWeight.Normal,
-    override val style: FontStyle = FontStyle.Normal
-) : AndroidPreloadedFont() {
-    override val typefaceInternal: Typeface? = Typeface.createFromAsset(assetManager, path)
-    override val cacheKey: String = "asset:$path"
-
-    override fun toString(): String {
-        return "Font(assetManager, path=$path, weight=$weight, style=$style)"
-    }
-
-    override fun equals(other: Any?): Boolean {
-        if (this === other) return true
-        if (javaClass != other?.javaClass) return false
-
-        other as AndroidAssetFont
-
-        if (path != other.path) return false
-
-        return true
-    }
-
-    override fun hashCode(): Int {
-        return path.hashCode()
-    }
-}
-
-private class AndroidFileFont constructor(
-    val file: File,
-    override val weight: FontWeight = FontWeight.Normal,
-    override val style: FontStyle = FontStyle.Normal
-) : AndroidPreloadedFont() {
-    override val typefaceInternal: Typeface? = Typeface.createFromFile(file)
-    override val cacheKey: String? = null
-
-    override fun toString(): String {
-        return "Font(file=$file, weight=$weight, style=$style)"
-    }
-}
-
-@RequiresApi(26)
-private class AndroidFileDescriptorFont constructor(
-    val fileDescriptor: ParcelFileDescriptor,
-    override val weight: FontWeight = FontWeight.Normal,
-    override val style: FontStyle = FontStyle.Normal
-) : AndroidPreloadedFont() {
-    override val typefaceInternal = if (Build.VERSION.SDK_INT >= 26) {
-        AndroidFileDescriptorHelper.create(fileDescriptor)
-    } else {
-        throw IllegalArgumentException("Cannot create font from file descriptor for SDK < 26")
-    }
-    override val cacheKey: String? = null
-
-    override fun toString(): String {
-        return "Font(fileDescriptor=$fileDescriptor, weight=$weight, style=$style)"
-    }
-}
-
-@RequiresApi(26)
-private object AndroidFileDescriptorHelper {
-    @RequiresApi(26)
-    @DoNotInline
-    fun create(fileDescriptor: ParcelFileDescriptor): Typeface {
-        return Typeface.Builder(fileDescriptor.fileDescriptor).build()
-    }
-}
+// keep generating AndroidFontKt to avoid API change
+private fun generateAndroidFontKtForApiCompatibility() {}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidLoadableFonts.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidLoadableFonts.kt
new file mode 100644
index 0000000..bfeb6c8
--- /dev/null
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/AndroidLoadableFonts.kt
@@ -0,0 +1,331 @@
+/*
+ * 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.font
+
+import android.content.Context
+import android.content.res.AssetManager
+import android.graphics.Typeface
+import android.graphics.fonts.FontVariationAxis
+import android.os.Build
+import android.os.ParcelFileDescriptor
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.util.fastMap
+import java.io.File
+
+/**
+ * Create a Font declaration from a file in the assets directory. The content of the [File] is
+ * read during construction.
+ *
+ * @param assetManager Android AssetManager
+ * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
+ * assets/dir/myfont.ttf).
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ */
+@ExperimentalTextApi
+@Stable
+@Deprecated("This experimental Font is replaced by Font(path, assetManager, ...)",
+    replaceWith = ReplaceWith("Font(path, assetManager, weight, style)"),
+    level = DeprecationLevel.WARNING
+)
+fun Font(
+    assetManager: AssetManager,
+    path: String,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal
+): Font = AndroidAssetFont(
+    assetManager,
+    path,
+    weight,
+    style,
+    FontVariation.Settings(weight, style)
+)
+
+/**
+ * Create a Font declaration from a file in the assets directory. The content of the [File] is
+ * read during construction.
+ *
+ * @param path full path starting from the assets directory (i.e. dir/myfont.ttf for
+ * assets/dir/myfont.ttf).
+ * @param assetManager Android AssetManager
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param variationSettings on API 26 and above these settings are applied to a variable font when
+ * the font is loaded
+ */
+@ExperimentalTextApi
+@Stable
+fun Font(
+    path: String,
+    assetManager: AssetManager,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
+): Font = AndroidAssetFont(assetManager, path, weight, style, variationSettings)
+
+/**
+ * Create a Font declaration from a file. The content of the [File] is read during construction.
+ *
+ * @param file the font file.
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param variationSettings on API 26 and above these settings are applied to a variable font when
+ * the font is loaded
+ */
+@ExperimentalTextApi
+@Stable
+@Suppress("StreamFiles")
+fun Font(
+    file: File,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
+): Font = AndroidFileFont(file, weight, style, variationSettings)
+
+/**
+ * Create a Font declaration from a [ParcelFileDescriptor]. The content of the
+ * [ParcelFileDescriptor] is read during construction.
+ *
+ * @param fileDescriptor the file descriptor for the font file.
+ * @param weight The weight of the font. The system uses this to match a font to a font request
+ * that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param style The style of the font, normal or italic. The system uses this to match a font to a
+ * font request that is given in a [androidx.compose.ui.text.SpanStyle].
+ * @param variationSettings these settings are applied to a variable font when the font is loaded
+ */
+@RequiresApi(26)
+@ExperimentalTextApi
+@Stable
+fun Font(
+    fileDescriptor: ParcelFileDescriptor,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
+): Font = AndroidFileDescriptorFont(fileDescriptor, weight, style, variationSettings)
+
+@OptIn(ExperimentalTextApi::class)
+internal sealed class AndroidPreloadedFont @OptIn(ExperimentalTextApi::class) constructor(
+    final override val weight: FontWeight,
+    final override val style: FontStyle,
+    variationSettings: FontVariation.Settings
+) : AndroidFont(
+    FontLoadingStrategy.Blocking,
+    AndroidPreloadedFontTypefaceLoader,
+    variationSettings
+) {
+    abstract val cacheKey: String?
+    internal abstract fun doLoad(context: Context?): Typeface?
+
+    private var didInitWithContext: Boolean = false
+    // subclasses MUST initialize this by calling doLoad(null) - after overriding doLoad as final
+    internal var typeface: Typeface? = null
+
+    internal fun loadCached(context: Context): Typeface? {
+        if (!didInitWithContext && typeface == null) {
+            typeface = doLoad(context)
+        }
+        didInitWithContext = true
+        return typeface
+    }
+}
+
+private object AndroidPreloadedFontTypefaceLoader : AndroidFont.TypefaceLoader {
+    override fun loadBlocking(context: Context, font: AndroidFont): Typeface? =
+        (font as? AndroidPreloadedFont)?.loadCached(context)
+
+    override suspend fun awaitLoad(context: Context, font: AndroidFont): Nothing {
+        throw UnsupportedOperationException("All preloaded fonts are blocking.")
+    }
+}
+
+@OptIn(ExperimentalTextApi::class) /* FontVariation.Settings */
+private class AndroidAssetFont constructor(
+    val assetManager: AssetManager,
+    val path: String,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings
+) : AndroidPreloadedFont(weight, style, variationSettings) {
+
+    override fun doLoad(context: Context?): Typeface? {
+        return if (Build.VERSION.SDK_INT >= 26) {
+            TypefaceBuilderCompat.createFromAssets(assetManager, path, context, variationSettings)
+        } else {
+            Typeface.createFromAsset(assetManager, path)
+        }
+    }
+
+    init {
+        typeface = doLoad(null)
+    }
+
+    override val cacheKey: String = "asset:$path"
+
+    override fun toString(): String {
+        return "Font(assetManager, path=$path, weight=$weight, style=$style)"
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as AndroidAssetFont
+
+        if (path != other.path) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        return path.hashCode()
+    }
+}
+
+@OptIn(ExperimentalTextApi::class)
+private class AndroidFileFont constructor(
+    val file: File,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings
+) : AndroidPreloadedFont(weight, style, variationSettings) {
+
+    override fun doLoad(context: Context?): Typeface? {
+        return if (Build.VERSION.SDK_INT >= 26) {
+            TypefaceBuilderCompat.createFromFile(file, context, variationSettings)
+        } else {
+            Typeface.createFromFile(file)
+        }
+    }
+
+    init {
+        typeface = doLoad(null)
+    }
+
+    override val cacheKey: String? = null
+    override fun toString(): String {
+        return "Font(file=$file, weight=$weight, style=$style)"
+    }
+}
+
+@RequiresApi(26)
+@OptIn(ExperimentalTextApi::class)
+private class AndroidFileDescriptorFont constructor(
+    val fileDescriptor: ParcelFileDescriptor,
+    weight: FontWeight = FontWeight.Normal,
+    style: FontStyle = FontStyle.Normal,
+    variationSettings: FontVariation.Settings
+) : AndroidPreloadedFont(weight, style, variationSettings) {
+
+    override fun doLoad(context: Context?): Typeface? {
+        return if (Build.VERSION.SDK_INT >= 26) {
+            TypefaceBuilderCompat.createFromFileDescriptor(
+                fileDescriptor,
+                context,
+                variationSettings
+            )
+        } else {
+            throw IllegalArgumentException("Cannot create font from file descriptor for SDK < 26")
+        }
+    }
+
+    init {
+        typeface = doLoad(null)
+    }
+
+    override val cacheKey: String? = null
+    override fun toString(): String {
+        return "Font(fileDescriptor=$fileDescriptor, weight=$weight, style=$style)"
+    }
+}
+
+@RequiresApi(api = 26)
+private object TypefaceBuilderCompat {
+    @ExperimentalTextApi
+    @DoNotInline
+    fun createFromAssets(
+        assetManager: AssetManager,
+        path: String,
+        context: Context?,
+        variationSettings: FontVariation.Settings
+    ): Typeface? {
+        if (context == null) {
+            return null
+        }
+        return Typeface.Builder(assetManager, path)
+            .setFontVariationSettings(variationSettings.toVariationSettings(context))
+            .build()
+    }
+
+    @ExperimentalTextApi
+    @DoNotInline
+    fun createFromFile(
+        file: File,
+        context: Context?,
+        variationSettings: FontVariation.Settings
+    ): Typeface? {
+        if (context == null) {
+            return null
+        }
+        return Typeface.Builder(file)
+            .setFontVariationSettings(variationSettings.toVariationSettings(context))
+            .build()
+    }
+
+    @ExperimentalTextApi
+    @DoNotInline
+    fun createFromFileDescriptor(
+        fileDescriptor: ParcelFileDescriptor,
+        context: Context?,
+        variationSettings: FontVariation.Settings,
+    ): Typeface? {
+        if (context == null) {
+            return null
+        }
+        return Typeface.Builder(fileDescriptor.fileDescriptor)
+            .setFontVariationSettings(variationSettings.toVariationSettings(context))
+            .build()
+    }
+
+    @RequiresApi(Build.VERSION_CODES.O)
+    @ExperimentalTextApi
+    private fun FontVariation.Settings.toVariationSettings(
+        context: Context?
+    ): Array<FontVariationAxis> {
+        val density = if (context != null) {
+            Density(context)
+        } else if (!needsDensity) {
+            // we don't need density, so make a fake one and be on with it
+            Density(1f, 1f)
+        } else {
+            // cannot reach
+            throw IllegalStateException("Required density, but not provided")
+        }
+        return settings.fastMap { setting ->
+            FontVariationAxis(setting.axisName, setting.toVariationValue(density))
+        }.toTypedArray()
+    }
+}
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt.kt
new file mode 100644
index 0000000..747853f
--- /dev/null
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/ActualParagraph.android.kt.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.
+ */
+
+@file:JvmName("AndroidParagraph_androidKt")
+
+package androidx.compose.ui.text.platform
+
+import androidx.compose.ui.text.AndroidParagraph
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.Paragraph
+import androidx.compose.ui.text.ParagraphIntrinsics
+import androidx.compose.ui.text.Placeholder
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.ceilToInt
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.createFontFamilyResolver
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+
+@Suppress("DEPRECATION")
+@Deprecated(
+    "Font.ResourceLoader is deprecated, instead pass FontFamily.Resolver",
+    replaceWith = ReplaceWith(
+        "ActualParagraph(text, style, spanStyles, placeholders, " +
+            "maxLines, ellipsis, width, density, fontFamilyResolver)"
+    ),
+)
+internal actual fun ActualParagraph(
+    text: String,
+    style: TextStyle,
+    spanStyles: List<AnnotatedString.Range<SpanStyle>>,
+    placeholders: List<AnnotatedString.Range<Placeholder>>,
+    maxLines: Int,
+    ellipsis: Boolean,
+    width: Float,
+    density: Density,
+    @Suppress("DEPRECATION") resourceLoader: Font.ResourceLoader
+): Paragraph = AndroidParagraph(
+    AndroidParagraphIntrinsics(
+        text = text,
+        style = style,
+        placeholders = placeholders,
+        spanStyles = spanStyles,
+        fontFamilyResolver = createFontFamilyResolver(resourceLoader),
+        density = density
+    ),
+    maxLines,
+    ellipsis,
+    Constraints(maxWidth = width.ceilToInt())
+)
+
+internal actual fun ActualParagraph(
+    text: String,
+    style: TextStyle,
+    spanStyles: List<AnnotatedString.Range<SpanStyle>>,
+    placeholders: List<AnnotatedString.Range<Placeholder>>,
+    maxLines: Int,
+    ellipsis: Boolean,
+    constraints: Constraints,
+    density: Density,
+    fontFamilyResolver: FontFamily.Resolver
+): Paragraph = AndroidParagraph(
+    AndroidParagraphIntrinsics(
+        text = text,
+        style = style,
+        placeholders = placeholders,
+        spanStyles = spanStyles,
+        fontFamilyResolver = fontFamilyResolver,
+        density = density
+    ),
+    maxLines,
+    ellipsis,
+    constraints
+)
+
+internal actual fun ActualParagraph(
+    paragraphIntrinsics: ParagraphIntrinsics,
+    maxLines: Int,
+    ellipsis: Boolean,
+    constraints: Constraints
+): Paragraph = AndroidParagraph(
+    paragraphIntrinsics as AndroidParagraphIntrinsics,
+    maxLines,
+    ellipsis,
+    constraints
+)
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
index 4238314..ee8ff19 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/extensions/SpannableExtensions.android.kt
@@ -126,14 +126,17 @@
 ) {
     val resolvedLineHeight = resolveLineHeightInPx(lineHeight, contextFontSize, density)
     if (!resolvedLineHeight.isNaN()) {
+        // in order to handle empty lines (including empty text) better, change endIndex so that
+        // it won't apply trimLastLineBottom rule
+        val endIndex = if (isEmpty() || last() == '\n') length + 1 else length
         setSpan(
             span = LineHeightStyleSpan(
                 lineHeight = resolvedLineHeight,
                 startIndex = 0,
-                endIndex = length,
+                endIndex = endIndex,
                 trimFirstLineTop = lineHeightStyle.trim.isTrimFirstLineTop(),
                 trimLastLineBottom = lineHeightStyle.trim.isTrimLastLineBottom(),
-                topPercentage = lineHeightStyle.alignment.topPercentage
+                topRatio = lineHeightStyle.alignment.topRatio
             ),
             start = 0,
             end = length
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
index 19d3286..8772d8d 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/AnnotatedString.kt
@@ -63,8 +63,10 @@
 
     init {
         var lastStyleEnd = -1
-        paragraphStyles.fastForEach { paragraphStyle ->
-            require(paragraphStyle.start >= lastStyleEnd) { "ParagraphStyle should not overlap" }
+        paragraphStyles.sortedBy { it.start }.fastForEach { paragraphStyle ->
+            require(paragraphStyle.start >= lastStyleEnd) {
+                "ParagraphStyle should not overlap"
+            }
             require(paragraphStyle.end <= text.length) {
                 "ParagraphStyle range [${paragraphStyle.start}, ${paragraphStyle.end})" +
                     " is out of boundary"
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
index 50286ce..701e2988 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
@@ -40,7 +40,7 @@
  * Paragraphs can be displayed on a [Canvas] using the [paint] method.
  */
 @JvmDefaultWithCompatibility
-interface Paragraph {
+expect sealed interface Paragraph {
     /**
      * The amount of horizontal space this paragraph occupies.
      */
@@ -255,11 +255,7 @@
         alpha: Float = Float.NaN,
         shadow: Shadow? = null,
         textDecoration: TextDecoration? = null
-    ) {
-        throw UnsupportedOperationException(
-            "Using brush for painting the paragraph is a separate functionality that " +
-                "is not supported on this platform")
-    }
+    )
 }
 
 /**
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
index e3ca5cd..3440d6c 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/ParagraphStyle.kt
@@ -56,17 +56,13 @@
  * @see TextStyle
  */
 @Immutable
-class ParagraphStyle @ExperimentalTextApi constructor(
+class ParagraphStyle constructor(
     val textAlign: TextAlign? = null,
     val textDirection: TextDirection? = null,
     val lineHeight: TextUnit = TextUnit.Unspecified,
     val textIndent: TextIndent? = null,
-    @ExperimentalTextApi
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalTextApi val platformStyle: PlatformParagraphStyle? = null,
-    @ExperimentalTextApi
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalTextApi val lineHeightStyle: LineHeightStyle? = null
+    val platformStyle: PlatformParagraphStyle? = null,
+    val lineHeightStyle: LineHeightStyle? = null
 ) {
 
     /**
@@ -90,7 +86,6 @@
      * @see SpanStyle
      * @see TextStyle
      */
-    @OptIn(ExperimentalTextApi::class)
     constructor(
         textAlign: TextAlign? = null,
         textDirection: TextDirection? = null,
@@ -120,7 +115,6 @@
      *
      * If the given paragraph style is null, returns this paragraph style.
      */
-    @OptIn(ExperimentalTextApi::class)
     @Stable
     fun merge(other: ParagraphStyle? = null): ParagraphStyle {
         if (other == null) return this
@@ -139,7 +133,6 @@
         )
     }
 
-    @OptIn(ExperimentalTextApi::class)
     private fun mergePlatformStyle(other: PlatformParagraphStyle?): PlatformParagraphStyle? {
         if (platformStyle == null) return other
         if (other == null) return platformStyle
@@ -152,7 +145,6 @@
     @Stable
     operator fun plus(other: ParagraphStyle): ParagraphStyle = this.merge(other)
 
-    @OptIn(ExperimentalTextApi::class)
     fun copy(
         textAlign: TextAlign? = this.textAlign,
         textDirection: TextDirection? = this.textDirection,
@@ -169,7 +161,6 @@
         )
     }
 
-    @ExperimentalTextApi
     fun copy(
         textAlign: TextAlign? = this.textAlign,
         textDirection: TextDirection? = this.textDirection,
@@ -188,7 +179,6 @@
         )
     }
 
-    @OptIn(ExperimentalTextApi::class)
     override operator fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is ParagraphStyle) return false
@@ -203,7 +193,6 @@
         return true
     }
 
-    @OptIn(ExperimentalTextApi::class)
     override fun hashCode(): Int {
         var result = textAlign?.hashCode() ?: 0
         result = 31 * result + (textDirection?.hashCode() ?: 0)
@@ -214,7 +203,6 @@
         return result
     }
 
-    @OptIn(ExperimentalTextApi::class)
     override fun toString(): String {
         return "ParagraphStyle(" +
             "textAlign=$textAlign, " +
@@ -240,7 +228,6 @@
  * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
  * 1.0, so negative values and values greater than 1.0 are valid.
  */
-@OptIn(ExperimentalTextApi::class)
 @Stable
 fun lerp(start: ParagraphStyle, stop: ParagraphStyle, fraction: Float): ParagraphStyle {
     return ParagraphStyle(
@@ -265,7 +252,6 @@
     )
 }
 
-@OptIn(ExperimentalTextApi::class)
 private fun lerpPlatformStyle(
     start: PlatformParagraphStyle?,
     stop: PlatformParagraphStyle?,
@@ -277,7 +263,6 @@
     return lerp(startNonNull, stopNonNull, fraction)
 }
 
-@OptIn(ExperimentalTextApi::class)
 internal fun resolveParagraphStyleDefaults(
     style: ParagraphStyle,
     direction: LayoutDirection
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt
index 2f7df74..549354e 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/PlatformTextStyle.kt
@@ -14,14 +14,11 @@
  * limitations under the License.
  */
 
-@file:OptIn(ExperimentalTextApi::class)
-
 package androidx.compose.ui.text
 
 /**
  * Provides platform specific [TextStyle] configuration options for styling and compatibility.
  */
-@ExperimentalTextApi
 expect class PlatformTextStyle {
     /**
      * Platform specific text span styling and compatibility configuration.
@@ -42,7 +39,6 @@
 /**
  * Provides platform specific [ParagraphStyle] configuration options for styling and compatibility.
  */
-@ExperimentalTextApi
 expect class PlatformParagraphStyle {
     companion object {
         val Default: PlatformParagraphStyle
@@ -54,7 +50,6 @@
 /**
  * Provides platform specific [SpanStyle] configuration options for styling and compatibility.
  */
-@ExperimentalTextApi
 expect class PlatformSpanStyle {
     companion object {
         val Default: PlatformSpanStyle
@@ -76,7 +71,6 @@
  * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
  * 1.0, so negative values and values greater than 1.0 are valid.
  */
-@ExperimentalTextApi
 expect fun lerp(
     start: PlatformParagraphStyle,
     stop: PlatformParagraphStyle,
@@ -96,7 +90,6 @@
  * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
  * 1.0, so negative values and values greater than 1.0 are valid.
  */
-@ExperimentalTextApi
 expect fun lerp(
     start: PlatformSpanStyle,
     stop: PlatformSpanStyle,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
index 9dcd322..758cdfa 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/SpanStyle.kt
@@ -80,7 +80,7 @@
  * @see ParagraphStyle
  */
 @Immutable
-class SpanStyle @OptIn(ExperimentalTextApi::class) internal constructor(
+class SpanStyle internal constructor(
     // The fill to draw text, a unified representation of Color and Brush.
     internal val textDrawStyle: TextDrawStyle,
     val fontSize: TextUnit = TextUnit.Unspecified,
@@ -96,9 +96,7 @@
     val background: Color = Color.Unspecified,
     val textDecoration: TextDecoration? = null,
     val shadow: Shadow? = null,
-    @ExperimentalTextApi
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalTextApi val platformStyle: PlatformSpanStyle? = null
+    val platformStyle: PlatformSpanStyle? = null
 ) {
 
     /**
@@ -133,7 +131,6 @@
      * @see TextStyle
      * @see ParagraphStyle
      */
-    @OptIn(ExperimentalTextApi::class)
     constructor(
         color: Color = Color.Unspecified,
         fontSize: TextUnit = TextUnit.Unspecified,
@@ -200,7 +197,6 @@
      * @see TextStyle
      * @see ParagraphStyle
      */
-    @ExperimentalTextApi
     constructor(
         color: Color = Color.Unspecified,
         fontSize: TextUnit = TextUnit.Unspecified,
@@ -339,7 +335,6 @@
      *
      * If the given span style is null, returns this span style.
      */
-    @OptIn(ExperimentalTextApi::class)
     @Stable
     fun merge(other: SpanStyle? = null): SpanStyle {
         if (other == null) return this
@@ -367,7 +362,6 @@
         )
     }
 
-    @OptIn(ExperimentalTextApi::class)
     private fun mergePlatformStyle(other: PlatformSpanStyle?): PlatformSpanStyle? {
         if (platformStyle == null) return other
         if (other == null) return platformStyle
@@ -380,7 +374,6 @@
     @Stable
     operator fun plus(other: SpanStyle): SpanStyle = this.merge(other)
 
-    @OptIn(ExperimentalTextApi::class)
     fun copy(
         color: Color = this.color,
         fontSize: TextUnit = this.fontSize,
@@ -416,7 +409,6 @@
         )
     }
 
-    @ExperimentalTextApi
     fun copy(
         color: Color = this.color,
         fontSize: TextUnit = this.fontSize,
@@ -498,7 +490,6 @@
             hasSameNonLayoutAttributes(other)
     }
 
-    @OptIn(ExperimentalTextApi::class)
     internal fun hasSameLayoutAffectingAttributes(other: SpanStyle): Boolean {
         if (this === other) return true
         if (fontSize != other.fontSize) return false
@@ -545,7 +536,6 @@
         return result
     }
 
-    @OptIn(ExperimentalTextApi::class)
     internal fun hashCodeLayoutAffectingAttributes(): Int {
         var result = fontSize.hashCode()
         result = 31 * result + (fontWeight?.hashCode() ?: 0)
@@ -614,7 +604,6 @@
  * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
  * 1.0, so negative values and values greater than 1.0 are valid.
  */
-@OptIn(ExperimentalTextApi::class)
 fun lerp(start: SpanStyle, stop: SpanStyle, fraction: Float): SpanStyle {
     return SpanStyle(
         textDrawStyle = lerp(start.textDrawStyle, stop.textDrawStyle, fraction),
@@ -679,7 +668,6 @@
     )
 }
 
-@OptIn(ExperimentalTextApi::class)
 private fun lerpPlatformStyle(
     start: PlatformSpanStyle?,
     stop: PlatformSpanStyle?,
@@ -691,7 +679,6 @@
     return lerp(startNonNull, stopNonNull, fraction)
 }
 
-@OptIn(ExperimentalTextApi::class)
 internal fun resolveSpanStyleDefaults(style: SpanStyle) = SpanStyle(
     textDrawStyle = style.textDrawStyle.takeOrElse { TextDrawStyle.from(DefaultColor) },
     fontSize = if (style.fontSize.isUnspecified) DefaultFontSize else style.fontSize,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
index 69748a9..1793326 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextPainter.kt
@@ -47,7 +47,7 @@
     @OptIn(ExperimentalTextApi::class)
     fun paint(canvas: Canvas, textLayoutResult: TextLayoutResult) {
         val needClipping = textLayoutResult.hasVisualOverflow &&
-            textLayoutResult.layoutInput.overflow == TextOverflow.Clip
+            textLayoutResult.layoutInput.overflow != TextOverflow.Visible
         if (needClipping) {
             val width = textLayoutResult.size.width.toFloat()
             val height = textLayoutResult.size.height.toFloat()
@@ -310,7 +310,7 @@
 
 private fun DrawTransform.clip(textLayoutResult: TextLayoutResult) {
     if (textLayoutResult.hasVisualOverflow &&
-        textLayoutResult.layoutInput.overflow == TextOverflow.Clip) {
+        textLayoutResult.layoutInput.overflow != TextOverflow.Visible) {
         clipRect(
             left = 0f,
             top = 0f,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
index 11d0b0f..3a53674 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
@@ -49,16 +49,11 @@
  * @see ParagraphStyle
  */
 @Immutable
-class TextStyle
-@OptIn(ExperimentalTextApi::class)
-internal constructor(
+class TextStyle internal constructor(
     internal val spanStyle: SpanStyle,
     internal val paragraphStyle: ParagraphStyle,
-    @ExperimentalTextApi
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ExperimentalTextApi val platformStyle: PlatformTextStyle? = null,
+    val platformStyle: PlatformTextStyle? = null,
 ) {
-    @OptIn(ExperimentalTextApi::class)
     internal constructor(
         spanStyle: SpanStyle,
         paragraphStyle: ParagraphStyle,
@@ -101,7 +96,6 @@
      * @param lineHeight Line height for the [Paragraph] in [TextUnit] unit, e.g. SP or EM.
      * @param textIndent The indentation of the paragraph.
      */
-    @OptIn(ExperimentalTextApi::class)
     constructor(
         color: Color = Color.Unspecified,
         fontSize: TextUnit = TextUnit.Unspecified,
@@ -185,7 +179,6 @@
      * and bottom of last line. The configuration is applied only when a [lineHeight] is defined.
      * When null, [LineHeightStyle.Default] is used.
      */
-    @ExperimentalTextApi
     constructor(
         color: Color = Color.Unspecified,
         fontSize: TextUnit = TextUnit.Unspecified,
@@ -395,7 +388,6 @@
     @Stable
     operator fun plus(other: SpanStyle): TextStyle = this.merge(other)
 
-    @OptIn(ExperimentalTextApi::class)
     fun copy(
         color: Color = this.spanStyle.color,
         fontSize: TextUnit = this.spanStyle.fontSize,
@@ -450,7 +442,6 @@
         )
     }
 
-    @ExperimentalTextApi
     fun copy(
         color: Color = this.spanStyle.color,
         fontSize: TextUnit = this.spanStyle.fontSize,
@@ -684,12 +675,8 @@
      *
      * When null, [LineHeightStyle.Default] is used.
      */
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @ExperimentalTextApi
-    @get:ExperimentalTextApi
     val lineHeightStyle: LineHeightStyle? get() = this.paragraphStyle.lineHeightStyle
 
-    @OptIn(ExperimentalTextApi::class)
     override fun equals(other: Any?): Boolean {
         if (this === other) return true
         if (other !is TextStyle) return false
@@ -714,13 +701,11 @@
      *
      * @param other The TextStyle to compare to.
      */
-    @OptIn(ExperimentalTextApi::class)
     fun hasSameLayoutAffectingAttributes(other: TextStyle): Boolean {
         return (this === other) || (paragraphStyle == other.paragraphStyle &&
             spanStyle.hasSameLayoutAffectingAttributes(other.spanStyle))
     }
 
-    @OptIn(ExperimentalTextApi::class)
     override fun hashCode(): Int {
         var result = spanStyle.hashCode()
         result = 31 * result + paragraphStyle.hashCode()
@@ -728,7 +713,6 @@
         return result
     }
 
-    @OptIn(ExperimentalTextApi::class)
     internal fun hashCodeLayoutAffectingAttributes(): Int {
         var result = spanStyle.hashCodeLayoutAffectingAttributes()
         result = 31 * result + paragraphStyle.hashCode()
@@ -800,7 +784,6 @@
  * @param direction a layout direction to be used for resolving text layout direction algorithm
  * @return resolved text style.
  */
-@OptIn(ExperimentalTextApi::class)
 fun resolveDefaults(style: TextStyle, direction: LayoutDirection) = TextStyle(
     spanStyle = resolveSpanStyleDefaults(style.spanStyle),
     paragraphStyle = resolveParagraphStyleDefaults(style.paragraphStyle, direction),
@@ -827,7 +810,6 @@
     }
 }
 
-@OptIn(ExperimentalTextApi::class)
 private fun createPlatformTextStyleInternal(
     platformSpanStyle: PlatformSpanStyle?,
     platformParagraphStyle: PlatformParagraphStyle?
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
new file mode 100644
index 0000000..c9fa94c
--- /dev/null
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/font/FontVariation.kt
@@ -0,0 +1,361 @@
+/*
+ * 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.font
+
+import androidx.compose.runtime.Immutable
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.util.fastAny
+
+/**
+ * Set font variation settings.
+ *
+ * To learn more about the font variation settings, see the list supported by
+ * [fonts.google.com](https://fonts.google.com/variablefonts#axis-definitions).
+ */
+@ExperimentalTextApi
+object FontVariation {
+    /**
+     * A collection of settings to apply to a single font.
+     *
+     * Settings must be unique on [Setting.axisName]
+     */
+    @Immutable
+    class Settings(vararg settings: Setting) {
+        /**
+         * All settings, unique by [FontVariation.Setting.axisName]
+         */
+        val settings: List<Setting>
+
+        /**
+         * True if density is required to resolve any of these settings
+         *
+         * If false, density will not affect the result of any [Setting.toVariationValue].
+         */
+        internal val needsDensity: Boolean
+
+        init {
+            this.settings = ArrayList(settings
+                .groupBy { it.axisName }
+                .flatMap { (key, value) ->
+                    require(value.size == 1) {
+                        "'$key' must be unique. Actual [ [${value.joinToString()}]"
+                    }
+                    value
+                })
+
+            needsDensity = this.settings.fastAny { it.needsDensity }
+        }
+    }
+
+    /**
+     * Represents a single point in a variation, such as 0.7 or 100
+     */
+    @Immutable
+    interface Setting {
+        /**
+         * Convert a value to a final value for use as a font variation setting.
+         *
+         * If [needsDensity] is false, density may be null
+         *
+         * @param density to resolve from Compose types to feature-specific ranges.
+         */
+        fun toVariationValue(density: Density?): Float
+
+        /**
+         * True if this setting requires density to resolve
+         *
+         * When false, may toVariationValue may be called with null or any Density
+         */
+        val needsDensity: Boolean
+
+        /**
+         * The font variation axis, such as 'wdth' or 'ital'
+         */
+        val axisName: String
+    }
+
+    @Immutable
+    private class SettingFloat(
+        override val axisName: String,
+        val value: Float
+    ) : Setting {
+        override fun toVariationValue(density: Density?): Float = value
+        override val needsDensity: Boolean = false
+
+        override fun equals(other: Any?): Boolean {
+            if (this === other) return true
+            if (other !is SettingFloat) return false
+
+            if (axisName != other.axisName) return false
+            if (value != other.value) return false
+
+            return true
+        }
+
+        override fun hashCode(): Int {
+            var result = axisName.hashCode()
+            result = 31 * result + value.hashCode()
+            return result
+        }
+
+        override fun toString(): String {
+            return "FontVariation.Setting(axisName='$axisName', value=$value)"
+        }
+    }
+
+    @Immutable
+    private class SettingTextUnit(
+        override val axisName: String,
+        val value: TextUnit
+    ) : Setting {
+        override fun toVariationValue(density: Density?): Float {
+            // we don't care about pixel density as 12sp is the same "visual" size on all devices
+            // instead we only care about font scaling, which changes visual size
+            requireNotNull(density) { "density must not be null" }
+            return value.value * density.fontScale
+        }
+
+        override val needsDensity: Boolean = true
+
+        override fun equals(other: Any?): Boolean {
+            if (this === other) return true
+            if (other !is SettingTextUnit) return false
+
+            if (axisName != other.axisName) return false
+            if (value != other.value) return false
+
+            return true
+        }
+
+        override fun hashCode(): Int {
+            var result = axisName.hashCode()
+            result = 31 * result + value.hashCode()
+            return result
+        }
+
+        override fun toString(): String {
+            return "FontVariation.Setting(axisName='$axisName', value=$value)"
+        }
+    }
+
+    @Immutable
+    private class SettingInt(
+        override val axisName: String,
+        val value: Int
+    ) : Setting {
+        override fun toVariationValue(density: Density?): Float = value.toFloat()
+        override val needsDensity: Boolean = false
+
+        override fun equals(other: Any?): Boolean {
+            if (this === other) return true
+            if (other !is SettingInt) return false
+
+            if (axisName != other.axisName) return false
+            if (value != other.value) return false
+
+            return true
+        }
+
+        override fun hashCode(): Int {
+            var result = axisName.hashCode()
+            result = 31 * result + value
+            return result
+        }
+
+        override fun toString(): String {
+            return "FontVariation.Setting(axisName='$axisName', value=$value)"
+        }
+    }
+
+    /**
+     * Create a font variation setting for any axis supported by a font.
+     *
+     * ```
+     * val setting = FontVariation.Setting('wght', 400f);
+     * ```
+     *
+     * You should typically not use this in app-code directly, instead define a method for each
+     * setting supported by your app/font.
+     *
+     * If you had a setting `fzzt` that set a variation setting called fizzable between 1 and 11,
+     * define a function like this:
+     *
+     * ```
+     * fun FontVariation.fizzable(fiz: Int): FontVariation.Setting {
+     *    require(fiz in 1..11) { "'fzzt' must be in 1..11" }
+     *    return Setting("fzzt", fiz.toFloat())
+     * ```
+     *
+     * @param name axis name, must be 4 characters
+     * @param value value for axis, not validated and directly passed to font
+     */
+    fun Setting(name: String, value: Float): Setting {
+        require(name.length == 4) {
+            "Name must be exactly four characters. Actual: '$name'"
+        }
+        return SettingFloat(name, value)
+    }
+
+    /**
+     * Italic or upright, equivalent to [FontStyle]
+     *
+     * 'ital', 0.0f is upright, and 1.0f is italic.
+     *
+     * A platform _may_ provide automatic setting of `ital` on font load. When supported, `ital` is
+     * automatically applied based on [FontStyle] if platform and the loaded font support 'ital'.
+     *
+     * Automatic mapping is done via [Settings]\([FontWeight], [FontStyle]\)
+     *
+     * To override this behavior provide an explicit FontVariation.italic to a [Font] that supports
+     * variation settings.
+     *
+     * @param value [0.0f, 1.0f]
+     */
+    fun italic(value: Float): Setting {
+        require(value in 0.0f..1.0f) {
+            "'ital' must be in 0.0f..1.0f. Actual: $value"
+        }
+        return SettingFloat("ital", value)
+    }
+
+    /**
+     * Optical size is how "big" a font appears to the eye.
+     *
+     * It should be set by a ratio from a font size.
+     *
+     * Adapt the style to specific text sizes. At smaller sizes, letters typically become optimized
+     * for more legibility. At larger sizes, optimized for headlines, with more extreme weights and
+     * widths.
+     *
+     * A Platform _may_ choose to support automatic optical sizing. When present, this will set the
+     * optical size based on the font size.
+     *
+     * To override this behavior provide an explicit FontVariation.opticalSizing to a [Font] that
+     * supports variation settings.
+     *
+     * @param textSize font-size at the expected display, must be in sp
+     */
+    fun opticalSizing(textSize: TextUnit): Setting {
+        require(textSize.isSp) {
+            "'opsz' must be provided in sp units"
+        }
+        return SettingTextUnit("opsz", textSize)
+    }
+
+    /**
+     * Adjust the style from upright to slanted, also known to typographers as an 'oblique' style.
+     *
+     * Rarely, slant can work in the other direction, called a 'backslanted' or 'reverse oblique'
+     * style.
+     *
+     * 'slnt', values as an angle, 0f is upright.
+     *
+     * @param value -90f to 90f, represents an angle
+     */
+    fun slant(value: Float): Setting {
+        require(value in -90f..90f) {
+            "'slnt' must be in -90f..90f. Actual: $value"
+        }
+        return SettingFloat("slnt", value)
+    }
+
+    /**
+     * Width of the type.
+     *
+     * Adjust the style from narrower to wider, by varying the proportions of counters, strokes,
+     * spacing and kerning, and other aspects of the type. This typically changes the typographic
+     * color in a subtle way, and so may be used in conjunction with Width and Grade axes.
+     *
+     * 'wdth', such as 10f
+     *
+     * @param value > 0.0f represents the width
+     */
+    fun width(value: Float): Setting {
+        require(value > 0.0f) {
+            "'wdth' must be strictly > 0.0f. Actual: $value"
+        }
+        return SettingFloat("wdth", value)
+    }
+
+    /**
+     * Weight, equivalent to [FontWeight]
+     *
+     * Setting weight always causes visual text reflow, to make text "bolder" or "thinner" without
+     * reflow see [grade]
+     *
+     * Adjust the style from lighter to bolder in typographic color, by varying stroke weights,
+     * spacing and kerning, and other aspects of the type. This typically changes overall width,
+     * and so may be used in conjunction with Width and Grade axes.
+     *
+     * This is equivalent to [FontWeight], and platforms _may_ support automatically setting 'wghts'
+     * from [FontWeight] during font load.
+     *
+     * Setting this does not change [FontWeight]. If an explicit value and [FontWeight] disagree,
+     * the weight specified by `wght` will be shown if the font supports it.
+     *
+     * Automatic mapping is done via [Settings]\([FontWeight], [FontStyle]\)
+     *
+     * @param value weight, in 1..1000
+     */
+    fun weight(value: Int): Setting {
+        require(value in 1..1000) {
+            "'wght' value must be in [1, 1000]. Actual: $value"
+        }
+        return SettingInt("wght", value)
+    }
+
+    /**
+     * Change visual weight of text without text reflow.
+     *
+     * Finesse the style from lighter to bolder in typographic color, without any changes overall
+     * width, line breaks or page layout. Negative grade makes the style lighter, while positive
+     * grade makes it bolder. The units are the same as in the Weight axis.
+     *
+     * Visual appearance of text with weight and grade set is similar to text with
+     *
+     * ```
+     * weight = (weight + grade)
+     * ```
+     *
+     * @param value grade, in -1000..1000
+     */
+    fun grade(value: Int): Setting {
+        require(value in -1000..1000) {
+            "'GRAD' must be in -1000..1000"
+        }
+        return SettingInt("GRAD", value)
+    }
+
+    /**
+     * Variation settings to configure a font with [FontWeight] and [FontStyle]
+     *
+     * @param weight to set 'wght' with [weight]\([FontWeight.weight])
+     * @param style to set 'ital' with [italic]\([FontStyle.value])
+     * @param settings other settings to apply, must not contain 'wght' or 'ital'
+     * @return settings that configure [FontWeight] and [FontStyle] on a font that supports
+     * 'wght' and 'ital'
+     */
+    fun Settings(
+        weight: FontWeight,
+        style: FontStyle,
+        vararg settings: Setting
+    ): Settings {
+        return Settings(weight(weight.weight), italic(style.value.toFloat()), *settings)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
index e7664d2..bb6949a 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/style/LineHeightStyle.kt
@@ -16,8 +16,8 @@
 
 package androidx.compose.ui.text.style
 
-import androidx.compose.ui.text.PlatformParagraphStyle
 import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.text.PlatformParagraphStyle
 
 /**
  * The configuration for line height such as alignment of the line in the provided line height,
@@ -35,7 +35,6 @@
  * bottom of the last line should be trimmed or not. This feature is available only when
  * [PlatformParagraphStyle.includeFontPadding] is false.
  */
-@ExperimentalTextApi
 class LineHeightStyle(
     val alignment: Alignment,
     val trim: Trim
@@ -81,7 +80,6 @@
      * [PlatformParagraphStyle.includeFontPadding] is false.
      */
     @kotlin.jvm.JvmInline
-    @ExperimentalTextApi
     value class Trim private constructor(private val value: Int) {
 
         override fun toString(): String {
@@ -192,24 +190,26 @@
 
     /**
      * Defines how to align the line in the space provided by the line height.
+     *
+     * @param topRatio the ratio of ascent to ascent+descent in percentage. Valid values are
+     * integers between 0f (inclusive) to 1f (inclusive).
      */
     @kotlin.jvm.JvmInline
-    @ExperimentalTextApi
-    value class Alignment private constructor(internal val topPercentage: Int) {
+    value class Alignment @ExperimentalTextApi constructor(internal val topRatio: Float) {
 
         init {
-            check(topPercentage in 0..100 || topPercentage == -1) {
-                "topRatio should be in [0..100] range or -1"
+            check(topRatio in 0f..1f || topRatio == -1f) {
+                "topRatio should be in [0..1] range or -1"
             }
         }
 
         override fun toString(): String {
-            return when (topPercentage) {
-                Top.topPercentage -> "LineHeightStyle.Alignment.Top"
-                Center.topPercentage -> "LineHeightStyle.Alignment.Center"
-                Proportional.topPercentage -> "LineHeightStyle.Alignment.Proportional"
-                Bottom.topPercentage -> "LineHeightStyle.Alignment.Bottom"
-                else -> "LineHeightStyle.Alignment(topPercentage = $topPercentage)"
+            return when (topRatio) {
+                Top.topRatio -> "LineHeightStyle.Alignment.Top"
+                Center.topRatio -> "LineHeightStyle.Alignment.Center"
+                Proportional.topRatio -> "LineHeightStyle.Alignment.Proportional"
+                Bottom.topRatio -> "LineHeightStyle.Alignment.Bottom"
+                else -> "LineHeightStyle.Alignment(topPercentage = $topRatio)"
             }
         }
 
@@ -235,7 +235,8 @@
              * +--------+
              * </pre>
              */
-            val Top = Alignment(topPercentage = 0)
+            @OptIn(ExperimentalTextApi::class)
+            val Top = Alignment(topRatio = 0f)
 
             /**
              * Align the line to the center of the space reserved for the line. This configuration
@@ -255,7 +256,8 @@
              * +--------+
              * </pre>
              */
-            val Center = Alignment(topPercentage = 50)
+            @OptIn(ExperimentalTextApi::class)
+            val Center = Alignment(topRatio = 0.5f)
 
             /**
              * Align the line proportional to the ascent and descent values of the line. For example
@@ -263,7 +265,8 @@
              * will be distributed as 8 units to top, and 2 units to the bottom of the line. This is
              * the default behavior.
              */
-            val Proportional = Alignment(topPercentage = -1)
+            @OptIn(ExperimentalTextApi::class)
+            val Proportional = Alignment(topRatio = -1f)
 
             /**
              * Align the line to the bottom of the space reserved for that line. This means that all
@@ -286,7 +289,8 @@
              * +--------+
              * </pre>
              */
-            val Bottom = Alignment(topPercentage = 100)
+            @OptIn(ExperimentalTextApi::class)
+            val Bottom = Alignment(topRatio = 1f)
         }
     }
 }
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt
index 5d3f39f..bcd4619 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/DesktopTextStyle.skiko.kt
@@ -134,7 +134,6 @@
  * between [start] and [stop]. The interpolation can be extrapolated beyond 0.0 and
  * 1.0, so negative values and values greater than 1.0 are valid.
  */
-@ExperimentalTextApi
 actual fun lerp(
     start: PlatformSpanStyle,
     stop: PlatformSpanStyle,
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
new file mode 100644
index 0000000..7661837
--- /dev/null
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
@@ -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.compose.ui.text
+
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Path
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.text.style.ResolvedTextDirection
+import androidx.compose.ui.text.style.TextDecoration
+
+actual sealed interface Paragraph {
+    actual val width: Float
+    actual val height: Float
+    actual val minIntrinsicWidth: Float
+    actual val maxIntrinsicWidth: Float
+    actual val firstBaseline: Float
+    actual val lastBaseline: Float
+    actual val didExceedMaxLines: Boolean
+    actual val lineCount: Int
+    actual val placeholderRects: List<Rect?>
+    actual fun getPathForRange(start: Int, end: Int): Path
+    actual fun getCursorRect(offset: Int): Rect
+    actual fun getLineLeft(lineIndex: Int): Float
+    actual fun getLineRight(lineIndex: Int): Float
+    actual fun getLineTop(lineIndex: Int): Float
+    actual fun getLineBottom(lineIndex: Int): Float
+    actual fun getLineHeight(lineIndex: Int): Float
+    actual fun getLineWidth(lineIndex: Int): Float
+    actual fun getLineStart(lineIndex: Int): Int
+    actual fun getLineEnd(lineIndex: Int, visibleEnd: Boolean): Int
+    actual fun isLineEllipsized(lineIndex: Int): Boolean
+    actual fun getLineForOffset(offset: Int): Int
+    actual fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float
+    actual fun getParagraphDirection(offset: Int): ResolvedTextDirection
+    actual fun getBidiRunDirection(offset: Int): ResolvedTextDirection
+    actual fun getLineForVerticalPosition(vertical: Float): Int
+    actual fun getOffsetForPosition(position: Offset): Int
+    actual fun getBoundingBox(offset: Int): Rect
+    actual fun getWordBoundary(offset: Int): TextRange
+    actual fun paint(canvas: Canvas, color: Color, shadow: Shadow?, textDecoration: TextDecoration?)
+    @ExperimentalTextApi
+    actual fun paint(
+        canvas: Canvas,
+        brush: Brush,
+        alpha: Float,
+        shadow: Shadow?,
+        textDecoration: TextDecoration?
+    )
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
new file mode 100644
index 0000000..15ef392
--- /dev/null
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
@@ -0,0 +1,324 @@
+/*
+ * 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
+
+import org.jetbrains.skia.Rect as SkRect
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Path
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.graphics.asSkiaPath
+import androidx.compose.ui.graphics.nativeCanvas
+import androidx.compose.ui.graphics.toComposeRect
+import androidx.compose.ui.text.platform.SkiaParagraphIntrinsics
+import androidx.compose.ui.text.platform.cursorHorizontalPosition
+import androidx.compose.ui.text.style.ResolvedTextDirection
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.unit.Constraints
+import kotlin.math.floor
+import org.jetbrains.skia.paragraph.LineMetrics
+import org.jetbrains.skia.paragraph.RectHeightMode
+import org.jetbrains.skia.paragraph.RectWidthMode
+import org.jetbrains.skia.paragraph.TextBox
+
+internal class SkiaParagraph(
+    intrinsics: ParagraphIntrinsics,
+    val maxLines: Int,
+    val ellipsis: Boolean,
+    val constraints: Constraints
+) : Paragraph {
+
+    private val ellipsisChar = if (ellipsis) "\u2026" else ""
+
+    private val paragraphIntrinsics = intrinsics as SkiaParagraphIntrinsics
+
+    private val layouter = paragraphIntrinsics.layouter()
+
+    /**
+     * Paragraph isn't always immutable, it could be changed via [paint] method without
+     * rerunning layout
+     */
+    private var para = layouter.layoutParagraph(
+        width = width,
+        maxLines = maxLines,
+        ellipsis = ellipsisChar
+    )
+
+    init {
+        para.layout(width)
+    }
+
+    private val text: String
+        get() = paragraphIntrinsics.text
+
+    override val width: Float
+        get() = constraints.maxWidth.toFloat()
+
+    override val height: Float
+        get() = para.height
+
+    override val minIntrinsicWidth: Float
+        get() = paragraphIntrinsics.minIntrinsicWidth
+
+    override val maxIntrinsicWidth: Float
+        get() = paragraphIntrinsics.maxIntrinsicWidth
+
+    override val firstBaseline: Float
+        get() = lineMetrics.firstOrNull()?.run { baseline.toFloat() } ?: 0f
+
+    override val lastBaseline: Float
+        get() = lineMetrics.lastOrNull()?.run { baseline.toFloat() } ?: 0f
+
+    override val didExceedMaxLines: Boolean
+        get() = para.didExceedMaxLines()
+
+    override val lineCount: Int
+        // workaround for https://bugs.chromium.org/p/skia/issues/detail?id=11321
+        get() = if (text == "") {
+            1
+        } else {
+            para.lineNumber.toInt()
+        }
+
+    override val placeholderRects: List<Rect?>
+        get() =
+            para.rectsForPlaceholders.map {
+                it.rect.toComposeRect()
+            }
+
+    override fun getPathForRange(start: Int, end: Int): Path {
+        val boxes = para.getRectsForRange(
+            start,
+            end,
+            RectHeightMode.MAX,
+            RectWidthMode.MAX
+        )
+        val path = Path()
+        for (b in boxes) {
+            path.asSkiaPath().addRect(b.rect)
+        }
+        return path
+    }
+
+    override fun getCursorRect(offset: Int): Rect {
+        val horizontal = getHorizontalPosition(offset, true)
+        val line = lineMetricsForOffset(offset)!!
+
+        return Rect(
+            horizontal,
+            (line.baseline - line.ascent).toFloat(),
+            horizontal,
+            (line.baseline + line.descent).toFloat()
+        )
+    }
+
+    override fun getLineLeft(lineIndex: Int): Float =
+        lineMetrics.getOrNull(lineIndex)?.left?.toFloat() ?: 0f
+
+    override fun getLineRight(lineIndex: Int): Float =
+        lineMetrics.getOrNull(lineIndex)?.right?.toFloat() ?: 0f
+
+    override fun getLineTop(lineIndex: Int) =
+        lineMetrics.getOrNull(lineIndex)?.let { line ->
+            floor((line.baseline - line.ascent).toFloat())
+        } ?: 0f
+
+    override fun getLineBottom(lineIndex: Int) =
+        lineMetrics.getOrNull(lineIndex)?.let { line ->
+            floor((line.baseline + line.descent).toFloat())
+        } ?: 0f
+
+    private fun lineMetricsForOffset(offset: Int): LineMetrics? {
+        val metrics = lineMetrics
+        for (line in metrics) {
+            if (offset < line.endIncludingNewline) {
+                return line
+            }
+        }
+        if (metrics.isEmpty()) {
+            return null
+        }
+        return metrics.last()
+    }
+
+    override fun getLineHeight(lineIndex: Int) = lineMetrics[lineIndex].height.toFloat()
+
+    override fun getLineWidth(lineIndex: Int) = lineMetrics[lineIndex].width.toFloat()
+
+    override fun getLineStart(lineIndex: Int) = lineMetrics[lineIndex].startIndex.toInt()
+
+    override fun getLineEnd(lineIndex: Int, visibleEnd: Boolean) =
+        if (visibleEnd) {
+            val metrics = lineMetrics[lineIndex]
+            // workarounds for https://bugs.chromium.org/p/skia/issues/detail?id=11321 :(
+            // we are waiting for fixes
+            if (lineIndex > 0 && metrics.startIndex < lineMetrics[lineIndex - 1].endIndex) {
+                metrics.endIndex.toInt()
+            } else if (
+                metrics.startIndex < text.length &&
+                text[metrics.startIndex.toInt()] == '\n'
+            ) {
+                metrics.startIndex.toInt()
+            } else {
+                metrics.endExcludingWhitespaces.toInt()
+            }
+        } else {
+            lineMetrics[lineIndex].endIndex.toInt()
+        }
+
+    override fun isLineEllipsized(lineIndex: Int) = false
+
+    override fun getLineForOffset(offset: Int) =
+        lineMetricsForOffset(offset)?.run { lineNumber.toInt() }
+            ?: 0
+
+    override fun getLineForVerticalPosition(vertical: Float): Int {
+        return 0
+    }
+
+    override fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float {
+        val prevBox = getBoxBackwardByOffset(offset)
+        val nextBox = getBoxForwardByOffset(offset)
+        return when {
+            prevBox == null && nextBox == null -> 0f
+            prevBox == null -> nextBox!!.cursorHorizontalPosition(true)
+            nextBox == null -> prevBox.cursorHorizontalPosition()
+            nextBox.direction == prevBox.direction -> nextBox.cursorHorizontalPosition(true)
+            // BiDi transition offset, we need to resolve ambiguity with usePrimaryDirection
+            // for details see comment for MultiParagraph.getHorizontalPosition
+            usePrimaryDirection -> prevBox.cursorHorizontalPosition()
+            else -> nextBox.cursorHorizontalPosition(true)
+        }
+    }
+
+    // workaround for https://bugs.chromium.org/p/skia/issues/detail?id=11321 :(
+    private val lineMetrics: Array<LineMetrics>
+        get() = if (text == "") {
+            val height = layouter.defaultHeight.toDouble()
+            arrayOf(
+                LineMetrics(
+                    0, 0, 0, 0, true,
+                    height, 0.0, height, height, 0.0, 0.0, height, 0
+                )
+            )
+        } else {
+            @Suppress("UNCHECKED_CAST", "USELESS_CAST")
+            para.lineMetrics as Array<LineMetrics>
+        }
+
+    private fun getBoxForwardByOffset(offset: Int): TextBox? {
+        var to = offset + 1
+        while (to <= text.length) {
+            val box = para.getRectsForRange(
+                offset, to,
+                RectHeightMode.STRUT, RectWidthMode.TIGHT
+            ).firstOrNull()
+            if (box != null) {
+                return box
+            }
+            to += 1
+        }
+        return null
+    }
+
+    private fun getBoxBackwardByOffset(offset: Int, end: Int = offset): TextBox? {
+        var from = offset - 1
+        while (from >= 0) {
+            val box = para.getRectsForRange(
+                from, end,
+                RectHeightMode.STRUT, RectWidthMode.TIGHT
+            ).firstOrNull()
+            when {
+                (box == null) -> from -= 1
+                (text.get(from) == '\n') -> {
+                    val bottom = box.rect.bottom + box.rect.bottom - box.rect.top
+                    val rect = SkRect(0f, box.rect.bottom, 0f, bottom)
+                    return TextBox(rect, box.direction)
+                }
+                else -> return box
+            }
+        }
+        return null
+    }
+
+    override fun getParagraphDirection(offset: Int): ResolvedTextDirection =
+        paragraphIntrinsics.textDirection
+
+    override fun getBidiRunDirection(offset: Int): ResolvedTextDirection =
+        when (getBoxForwardByOffset(offset)?.direction) {
+            org.jetbrains.skia.paragraph.Direction.RTL -> ResolvedTextDirection.Rtl
+            org.jetbrains.skia.paragraph.Direction.LTR -> ResolvedTextDirection.Ltr
+            null -> ResolvedTextDirection.Ltr
+        }
+
+    override fun getOffsetForPosition(position: Offset): Int {
+        return para.getGlyphPositionAtCoordinate(position.x, position.y).position
+    }
+
+    override fun getBoundingBox(offset: Int): Rect {
+        val box = getBoxForwardByOffset(offset) ?: getBoxBackwardByOffset(offset, text.length)!!
+        return box.rect.toComposeRect()
+    }
+
+    override fun getWordBoundary(offset: Int): TextRange {
+        return when {
+            (text[offset].isLetterOrDigit()) -> para.getWordBoundary(offset).let {
+                TextRange(it.start, it.end)
+            }
+            (text.getOrNull(offset - 1)?.isLetterOrDigit() ?: false) ->
+                para.getWordBoundary(offset - 1).let {
+                    TextRange(it.start, it.end)
+                }
+            else -> TextRange(offset, offset)
+        }
+    }
+
+    // TODO(b/229518449): Implement an alternative to paint function that takes a brush.
+    override fun paint(
+        canvas: Canvas,
+        color: Color,
+        shadow: Shadow?,
+        textDecoration: TextDecoration?
+    ) {
+        para = layouter.layoutParagraph(
+            width = width,
+            maxLines = maxLines,
+            ellipsis = ellipsisChar,
+            color = color,
+            shadow = shadow,
+            textDecoration = textDecoration
+        )
+
+        para.paint(canvas.nativeCanvas, 0.0f, 0.0f)
+    }
+
+    @ExperimentalTextApi
+    override fun paint(
+        canvas: Canvas,
+        brush: Brush,
+        alpha: Float,
+        shadow: Shadow?,
+        textDecoration: TextDecoration?
+    ) {
+        throw UnsupportedOperationException(
+            "Using brush for painting the paragraph is a separate functionality that " +
+                "is not supported on this platform")
+    }
+}
diff --git a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt
index 2e43f89..bf56205 100644
--- a/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt
+++ b/compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/platform/SkiaParagraph.skiko.kt
@@ -15,25 +15,34 @@
  */
 package androidx.compose.ui.text.platform
 
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.graphics.Canvas
+import org.jetbrains.skia.Font as SkFont
+import org.jetbrains.skia.FontStyle as SkFontStyle
+import org.jetbrains.skia.paragraph.Alignment as SkAlignment
+import org.jetbrains.skia.paragraph.BaselineMode
+import org.jetbrains.skia.paragraph.DecorationLineStyle as SkDecorationLineStyle
+import org.jetbrains.skia.paragraph.DecorationStyle as SkDecorationStyle
+import org.jetbrains.skia.paragraph.Direction as SkDirection
+import org.jetbrains.skia.paragraph.Paragraph as SkParagraph
+import org.jetbrains.skia.paragraph.ParagraphBuilder as SkParagraphBuilder
+import org.jetbrains.skia.paragraph.ParagraphStyle
+import org.jetbrains.skia.paragraph.PlaceholderAlignment
+import org.jetbrains.skia.paragraph.PlaceholderStyle
+import org.jetbrains.skia.paragraph.Shadow as SkShadow
+import org.jetbrains.skia.paragraph.StrutStyle
+import org.jetbrains.skia.paragraph.TextBox
+import org.jetbrains.skia.paragraph.TextStyle as SkTextStyle
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.Path
 import androidx.compose.ui.graphics.Shadow
-import androidx.compose.ui.graphics.asSkiaPath
 import androidx.compose.ui.graphics.isSpecified
-import androidx.compose.ui.graphics.nativeCanvas
 import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.graphics.toComposeRect
 import androidx.compose.ui.text.AnnotatedString.Range
 import androidx.compose.ui.text.ExperimentalTextApi
 import androidx.compose.ui.text.Paragraph
 import androidx.compose.ui.text.ParagraphIntrinsics
 import androidx.compose.ui.text.Placeholder
 import androidx.compose.ui.text.PlaceholderVerticalAlign
+import androidx.compose.ui.text.SkiaParagraph
 import androidx.compose.ui.text.SpanStyle
-import androidx.compose.ui.text.TextRange
 import androidx.compose.ui.text.TextStyle
 import androidx.compose.ui.text.ceilToInt
 import androidx.compose.ui.text.font.Font
@@ -52,32 +61,11 @@
 import androidx.compose.ui.text.style.TextGeometricTransform
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.isUnspecified
 import androidx.compose.ui.unit.TextUnit
 import androidx.compose.ui.unit.isSpecified
+import androidx.compose.ui.unit.isUnspecified
 import androidx.compose.ui.unit.sp
 import org.jetbrains.skia.Paint
-import org.jetbrains.skia.paragraph.Alignment as SkAlignment
-import org.jetbrains.skia.paragraph.BaselineMode
-import org.jetbrains.skia.paragraph.Direction as SkDirection
-import org.jetbrains.skia.paragraph.LineMetrics
-import org.jetbrains.skia.paragraph.ParagraphBuilder
-import org.jetbrains.skia.paragraph.ParagraphStyle
-import org.jetbrains.skia.paragraph.PlaceholderAlignment
-import org.jetbrains.skia.paragraph.PlaceholderStyle
-import org.jetbrains.skia.paragraph.RectHeightMode
-import org.jetbrains.skia.paragraph.RectWidthMode
-import org.jetbrains.skia.paragraph.StrutStyle
-import org.jetbrains.skia.paragraph.TextBox
-import kotlin.math.floor
-import org.jetbrains.skia.Rect as SkRect
-import org.jetbrains.skia.paragraph.Paragraph as SkParagraph
-import org.jetbrains.skia.paragraph.TextStyle as SkTextStyle
-import org.jetbrains.skia.FontStyle as SkFontStyle
-import org.jetbrains.skia.Font as SkFont
-import org.jetbrains.skia.paragraph.DecorationLineStyle as SkDecorationLineStyle
-import org.jetbrains.skia.paragraph.DecorationStyle as SkDecorationStyle
-import org.jetbrains.skia.paragraph.Shadow as SkShadow
 
 private val DefaultFontSize = 16.sp
 
@@ -148,278 +136,6 @@
     constraints
 )
 
-internal class SkiaParagraph(
-    intrinsics: ParagraphIntrinsics,
-    val maxLines: Int,
-    val ellipsis: Boolean,
-    val constraints: Constraints
-) : Paragraph {
-
-    private val ellipsisChar = if (ellipsis) "\u2026" else ""
-
-    private val paragraphIntrinsics = intrinsics as SkiaParagraphIntrinsics
-
-    private val layouter = paragraphIntrinsics.layouter()
-
-    /**
-     * Paragraph isn't always immutable, it could be changed via [paint] method without
-     * rerunning layout
-     */
-    private var para = layouter.layoutParagraph(
-        width = width,
-        maxLines = maxLines,
-        ellipsis = ellipsisChar
-    )
-
-    init {
-        para.layout(width)
-    }
-
-    private val text: String
-        get() = paragraphIntrinsics.text
-
-    override val width: Float
-        get() = constraints.maxWidth.toFloat()
-
-    override val height: Float
-        get() = para.height
-
-    override val minIntrinsicWidth: Float
-        get() = paragraphIntrinsics.minIntrinsicWidth
-
-    override val maxIntrinsicWidth: Float
-        get() = paragraphIntrinsics.maxIntrinsicWidth
-
-    override val firstBaseline: Float
-        get() = lineMetrics.firstOrNull()?.run { baseline.toFloat() } ?: 0f
-
-    override val lastBaseline: Float
-        get() = lineMetrics.lastOrNull()?.run { baseline.toFloat() } ?: 0f
-
-    override val didExceedMaxLines: Boolean
-        get() = para.didExceedMaxLines()
-
-    override val lineCount: Int
-        // workaround for https://bugs.chromium.org/p/skia/issues/detail?id=11321
-        get() = if (text == "") {
-            1
-        } else {
-            para.lineNumber.toInt()
-        }
-
-    override val placeholderRects: List<Rect?>
-        get() =
-            para.rectsForPlaceholders.map {
-                it.rect.toComposeRect()
-            }
-
-    override fun getPathForRange(start: Int, end: Int): Path {
-        val boxes = para.getRectsForRange(
-            start,
-            end,
-            RectHeightMode.MAX,
-            RectWidthMode.MAX
-        )
-        val path = Path()
-        for (b in boxes) {
-            path.asSkiaPath().addRect(b.rect)
-        }
-        return path
-    }
-
-    override fun getCursorRect(offset: Int): Rect {
-        val horizontal = getHorizontalPosition(offset, true)
-        val line = lineMetricsForOffset(offset)!!
-
-        return Rect(
-            horizontal,
-            (line.baseline - line.ascent).toFloat(),
-            horizontal,
-            (line.baseline + line.descent).toFloat()
-        )
-    }
-
-    override fun getLineLeft(lineIndex: Int): Float =
-        lineMetrics.getOrNull(lineIndex)?.left?.toFloat() ?: 0f
-
-    override fun getLineRight(lineIndex: Int): Float =
-        lineMetrics.getOrNull(lineIndex)?.right?.toFloat() ?: 0f
-
-    override fun getLineTop(lineIndex: Int) =
-        lineMetrics.getOrNull(lineIndex)?.let { line ->
-            floor((line.baseline - line.ascent).toFloat())
-        } ?: 0f
-
-    override fun getLineBottom(lineIndex: Int) =
-        lineMetrics.getOrNull(lineIndex)?.let { line ->
-            floor((line.baseline + line.descent).toFloat())
-        } ?: 0f
-
-    private fun lineMetricsForOffset(offset: Int): LineMetrics? {
-        val metrics = lineMetrics
-        for (line in metrics) {
-            if (offset < line.endIncludingNewline) {
-                return line
-            }
-        }
-        if (metrics.isEmpty()) {
-            return null
-        }
-        return metrics.last()
-    }
-
-    override fun getLineHeight(lineIndex: Int) = lineMetrics[lineIndex].height.toFloat()
-
-    override fun getLineWidth(lineIndex: Int) = lineMetrics[lineIndex].width.toFloat()
-
-    override fun getLineStart(lineIndex: Int) = lineMetrics[lineIndex].startIndex.toInt()
-
-    override fun getLineEnd(lineIndex: Int, visibleEnd: Boolean) =
-        if (visibleEnd) {
-            val metrics = lineMetrics[lineIndex]
-            // workarounds for https://bugs.chromium.org/p/skia/issues/detail?id=11321 :(
-            // we are waiting for fixes
-            if (lineIndex > 0 && metrics.startIndex < lineMetrics[lineIndex - 1].endIndex) {
-                metrics.endIndex.toInt()
-            } else if (
-                metrics.startIndex < text.length &&
-                text[metrics.startIndex.toInt()] == '\n'
-            ) {
-                metrics.startIndex.toInt()
-            } else {
-                metrics.endExcludingWhitespaces.toInt()
-            }
-        } else {
-            lineMetrics[lineIndex].endIndex.toInt()
-        }
-
-    override fun isLineEllipsized(lineIndex: Int) = false
-
-    override fun getLineForOffset(offset: Int) =
-        lineMetricsForOffset(offset)?.run { lineNumber.toInt() }
-            ?: 0
-
-    override fun getLineForVerticalPosition(vertical: Float): Int {
-        return 0
-    }
-
-    override fun getHorizontalPosition(offset: Int, usePrimaryDirection: Boolean): Float {
-        val prevBox = getBoxBackwardByOffset(offset)
-        val nextBox = getBoxForwardByOffset(offset)
-        return when {
-            prevBox == null && nextBox == null -> 0f
-            prevBox == null -> nextBox!!.cursorHorizontalPosition(true)
-            nextBox == null -> prevBox.cursorHorizontalPosition()
-            nextBox.direction == prevBox.direction -> nextBox.cursorHorizontalPosition(true)
-            // BiDi transition offset, we need to resolve ambiguity with usePrimaryDirection
-            // for details see comment for MultiParagraph.getHorizontalPosition
-            usePrimaryDirection -> prevBox.cursorHorizontalPosition()
-            else -> nextBox.cursorHorizontalPosition(true)
-        }
-    }
-
-    // workaround for https://bugs.chromium.org/p/skia/issues/detail?id=11321 :(
-    private val lineMetrics: Array<LineMetrics>
-        get() = if (text == "") {
-            val height = layouter.defaultHeight.toDouble()
-            arrayOf(
-                LineMetrics(
-                    0, 0, 0, 0, true,
-                    height, 0.0, height, height, 0.0, 0.0, height, 0
-                )
-            )
-        } else {
-            @Suppress("UNCHECKED_CAST", "USELESS_CAST")
-            para.lineMetrics as Array<LineMetrics>
-        }
-
-    private fun getBoxForwardByOffset(offset: Int): TextBox? {
-        var to = offset + 1
-        while (to <= text.length) {
-            val box = para.getRectsForRange(
-                offset, to,
-                RectHeightMode.STRUT, RectWidthMode.TIGHT
-            ).firstOrNull()
-            if (box != null) {
-                return box
-            }
-            to += 1
-        }
-        return null
-    }
-
-    private fun getBoxBackwardByOffset(offset: Int, end: Int = offset): TextBox? {
-        var from = offset - 1
-        while (from >= 0) {
-            val box = para.getRectsForRange(
-                from, end,
-                RectHeightMode.STRUT, RectWidthMode.TIGHT
-            ).firstOrNull()
-            when {
-                (box == null) -> from -= 1
-                (text.get(from) == '\n') -> {
-                    val bottom = box.rect.bottom + box.rect.bottom - box.rect.top
-                    val rect = SkRect(0f, box.rect.bottom, 0f, bottom)
-                    return TextBox(rect, box.direction)
-                }
-                else -> return box
-            }
-        }
-        return null
-    }
-
-    override fun getParagraphDirection(offset: Int): ResolvedTextDirection =
-        paragraphIntrinsics.textDirection
-
-    override fun getBidiRunDirection(offset: Int): ResolvedTextDirection =
-        when (getBoxForwardByOffset(offset)?.direction) {
-            org.jetbrains.skia.paragraph.Direction.RTL -> ResolvedTextDirection.Rtl
-            org.jetbrains.skia.paragraph.Direction.LTR -> ResolvedTextDirection.Ltr
-            null -> ResolvedTextDirection.Ltr
-        }
-
-    override fun getOffsetForPosition(position: Offset): Int {
-        return para.getGlyphPositionAtCoordinate(position.x, position.y).position
-    }
-
-    override fun getBoundingBox(offset: Int): Rect {
-        val box = getBoxForwardByOffset(offset) ?: getBoxBackwardByOffset(offset, text.length)!!
-        return box.rect.toComposeRect()
-    }
-
-    override fun getWordBoundary(offset: Int): TextRange {
-        return when {
-            (text[offset].isLetterOrDigit()) -> para.getWordBoundary(offset).let {
-                TextRange(it.start, it.end)
-            }
-            (text.getOrNull(offset - 1)?.isLetterOrDigit() ?: false) ->
-                para.getWordBoundary(offset - 1).let {
-                    TextRange(it.start, it.end)
-                }
-            else -> TextRange(offset, offset)
-        }
-    }
-
-    // TODO(b/229518449): Implement an alternative to paint function that takes a brush.
-    override fun paint(
-        canvas: Canvas,
-        color: Color,
-        shadow: Shadow?,
-        textDecoration: TextDecoration?
-    ) {
-        para = layouter.layoutParagraph(
-            width = width,
-            maxLines = maxLines,
-            ellipsis = ellipsisChar,
-            color = color,
-            shadow = shadow,
-            textDecoration = textDecoration
-        )
-
-        para.paint(canvas.nativeCanvas, 0.0f, 0.0f)
-    }
-}
-
 private fun fontSizeInHierarchy(density: Density, base: Float, other: TextUnit): Float {
     return when {
         other.isUnspecified -> base
@@ -604,7 +320,7 @@
             else -> throw IllegalStateException("Unsupported font loader $platformFontLoader")
         }
 
-        val pb = ParagraphBuilder(ps, fontCollection)
+        val pb = SkParagraphBuilder(ps, fontCollection)
 
         var addText = true
 
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringTest.kt
index d27994f..e73d220 100644
--- a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringTest.kt
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/AnnotatedStringTest.kt
@@ -532,4 +532,31 @@
         }
         annotatedString.toUpperCase()
     }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun subSequence_throws_exception_for_overlapping_paragraphStyles() {
+        buildAnnotatedString {
+            append("1234")
+            addStyle(ParagraphStyle(), 0, 2)
+            addStyle(ParagraphStyle(), 1, 3)
+        }
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun subSequence_throws_exception_for_overlapping_paragraphStyles_when_not_sorted() {
+        buildAnnotatedString {
+            append("1234")
+            addStyle(ParagraphStyle(), 1, 3)
+            addStyle(ParagraphStyle(), 0, 2)
+        }
+    }
+
+    @Test
+    fun doesNot_throw_exception_if_paragraphStyles_are_not_sorted() {
+        buildAnnotatedString {
+            append("1234")
+            addStyle(ParagraphStyle(), 3, 4)
+            addStyle(ParagraphStyle(), 0, 2)
+        }
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/font/FontVariationTest.kt b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/font/FontVariationTest.kt
new file mode 100644
index 0000000..235c040
--- /dev/null
+++ b/compose/ui/ui-text/src/test/java/androidx/compose/ui/text/font/FontVariationTest.kt
@@ -0,0 +1,165 @@
+/*
+ * 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.font
+
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.sp
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@OptIn(ExperimentalTextApi::class)
+@RunWith(JUnit4::class)
+class FontVariationTest {
+    @Test
+    fun ital_setsItal() {
+        val fontVariation = FontVariation.italic(0.7f)
+        assertThat(fontVariation.toVariationValue(null)).isEqualTo(0.7f)
+        assertThat(fontVariation.axisName).isEqualTo("ital")
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun ital_throws_whenTooLow() {
+        FontVariation.italic(-1.0f)
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun ital_throws_whenTooHigh() {
+        FontVariation.italic(1.1f)
+    }
+
+    @Test
+    fun Opsz_sets() {
+        val fontVariation = FontVariation.opticalSizing(18.sp)
+        assertThat(fontVariation.toVariationValue(Density(1f))).isEqualTo(18f)
+        assertThat(fontVariation.axisName).isEqualTo("opsz")
+    }
+
+    @Test
+    fun Opsz_convertsWithDensity() {
+        val fontVariation = FontVariation.opticalSizing(18.sp)
+        val density = Density(10f, 3f)
+        assertThat(fontVariation.toVariationValue(density)).isEqualTo(54f)
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun Opsz_throws_whenTooLow() {
+        FontVariation.opticalSizing(TextUnit.Unspecified)
+    }
+
+    @Test
+    fun Opsz_needsDensity() {
+        val fontVariation = FontVariation.opticalSizing(18.sp)
+        assertThat(fontVariation.needsDensity).isTrue()
+    }
+
+    @Test
+    fun Slnt_sets() {
+        val fontVariation = FontVariation.slant(0.7f)
+        assertThat(fontVariation.toVariationValue(null)).isEqualTo(0.7f)
+        assertThat(fontVariation.axisName).isEqualTo("slnt")
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun Slnt_throws_whenTooSmall() {
+        FontVariation.slant(-91f)
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun Slnt_throws_whenTooBig() {
+        FontVariation.slant(91f)
+    }
+
+    @Test
+    fun Wdth_sets() {
+        val fontVariation = FontVariation.width(0.7f)
+        assertThat(fontVariation.toVariationValue(null)).isEqualTo(0.7f)
+        assertThat(fontVariation.axisName).isEqualTo("wdth")
+    }
+
+    @Test
+    fun Wdth_sets_atMaxSize() {
+        val fontVariation = FontVariation.width(Float.MAX_VALUE)
+        assertThat(fontVariation.toVariationValue(null)).isEqualTo(Float.MAX_VALUE)
+        assertThat(fontVariation.axisName).isEqualTo("wdth")
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun Wdth_throws_whenTooSmall() {
+        FontVariation.width(0f)
+    }
+
+    @Test
+    fun Wght_sets() {
+        val fontVariation = FontVariation.weight(200)
+        assertThat(fontVariation.toVariationValue(null)).isEqualTo(200)
+        assertThat(fontVariation.axisName).isEqualTo("wght")
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun Wght_throws_whenTooSmall() {
+        FontVariation.weight(0)
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun Wght_throws_whenTooBig() {
+        FontVariation.weight(1001)
+    }
+
+    @Test
+    fun grad_sets() {
+        val fontVariation = FontVariation.grade(200)
+        assertThat(fontVariation.toVariationValue(null)).isEqualTo(200)
+        assertThat(fontVariation.axisName).isEqualTo("GRAD")
+    }
+
+    @Test(expected = IllegalArgumentException::class)
+    fun grad_throws_whenTooSmall() {
+        FontVariation.grade(-1001)
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun grad_throws_whenTooBig() {
+        FontVariation.grade(1001)
+    }
+
+    @Test
+    fun setting_makesSetting() {
+        val setting: FontVariation.Setting = FontVariation.Setting("1234", 8.9f)
+        assertThat(setting.axisName).isEqualTo("1234")
+        assertThat(setting.toVariationValue(null)).isEqualTo(8.9f)
+    }
+
+    @Test(expected = java.lang.IllegalArgumentException::class)
+    fun setting_throws_whenBadName() {
+        FontVariation.Setting("Weight", 500f)
+    }
+
+    @Test
+    fun canExtend() {
+        fun FontVariation.fizzable(fiz: Int): FontVariation.Setting {
+            require(fiz in 1..11) { "'fzzt' must be in 1..11" }
+            return Setting("fzzt", fiz.toFloat())
+        }
+        val variation = FontVariation.fizzable(7)
+        assertThat(variation.axisName).isEqualTo("fzzt")
+        assertThat(variation.toVariationValue(null)).isEqualTo(7f)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-tooling-data/build.gradle b/compose/ui/ui-tooling-data/build.gradle
index 79fe224..4dcc5fb 100644
--- a/compose/ui/ui-tooling-data/build.gradle
+++ b/compose/ui/ui-tooling-data/build.gradle
@@ -39,7 +39,7 @@
 
         api "androidx.annotation:annotation:1.1.0"
 
-        api("androidx.compose.runtime:runtime:1.2.0-rc02")
+        api("androidx.compose.runtime:runtime:1.2.0")
         api(project(":compose:ui:ui"))
 
         androidTestImplementation project(":compose:ui:ui-test-junit4")
@@ -76,7 +76,7 @@
 
                 api "androidx.annotation:annotation:1.1.0"
 
-                api("androidx.compose.runtime:runtime:1.2.0-rc02")
+                api("androidx.compose.runtime:runtime:1.2.0")
                 api(project(":compose:ui:ui"))
             }
             jvmMain.dependencies {
diff --git a/compose/ui/ui-tooling/build.gradle b/compose/ui/ui-tooling/build.gradle
index 47aed24..f8b91da 100644
--- a/compose/ui/ui-tooling/build.gradle
+++ b/compose/ui/ui-tooling/build.gradle
@@ -38,7 +38,7 @@
         api(project(":compose:ui:ui"))
         api(project(":compose:ui:ui-tooling-preview"))
         api(project(":compose:ui:ui-tooling-data"))
-        implementation("androidx.savedstate:savedstate-ktx:1.2.0-rc01")
+        implementation("androidx.savedstate:savedstate-ktx:1.2.0")
         implementation("androidx.compose.material:material:1.0.0")
         implementation("androidx.activity:activity-compose:1.3.0")
 
@@ -79,13 +79,13 @@
                 api(project(":compose:ui:ui-tooling-preview"))
                 api(project(":compose:runtime:runtime"))
                 api(project(":compose:ui:ui"))
+                api(project(":compose:ui:ui-tooling-data"))
             }
             androidMain.dependencies {
                 api("androidx.annotation:annotation:1.1.0")
                 implementation(project(":compose:animation:animation"))
-                implementation("androidx.savedstate:savedstate-ktx:1.2.0-rc01")
+                implementation("androidx.savedstate:savedstate-ktx:1.2.0")
 
-                api(project(":compose:ui:ui-tooling-data"))
                 implementation(project(":compose:material:material"))
                 implementation("androidx.activity:activity-compose:1.3.0")
 
diff --git a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
index 897401a..89882d6 100644
--- a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
+++ b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/ComposeViewAdapterTest.kt
@@ -154,17 +154,8 @@
     }
 
     @Test
-    fun animatedContentIsIgnored() {
-        assertRendersCorrectly(
-            "androidx.compose.ui.tooling.TestAnimationPreviewKt",
-            "AnimatedContentPreview"
-        )
-
-        activityTestRule.runOnUiThread {
-            // Verify that this composable has no animations, since we should ignore
-            // AnimatedContent animations
-            assertFalse(composeViewAdapter.hasAnimations())
-        }
+    fun animatedContentIsSubscribed() {
+        checkUnsupportedIsSubscribed("AnimatedContentPreview", listOf("AnimatedContent"))
     }
 
     @Test
@@ -177,6 +168,66 @@
         checkTransitionIsSubscribed("CheckBoxScaffoldPreview", "checkBoxAnim")
     }
 
+    @Test
+    fun animateXAsStateIsSubscribed() {
+        checkUnsupportedIsSubscribed(
+            "AnimateAsStatePreview",
+            listOf("animateValueAsState", "animateValueAsState")
+        )
+    }
+
+    @Test
+    fun animateContentSizeIsSubscribed() {
+        checkUnsupportedIsSubscribed("AnimateContentSizePreview", listOf("animateContentSize"))
+    }
+
+    @Test
+    fun crossFadeIsSubscribed() {
+        checkTransitionIsSubscribed("CrossFadePreview", "String")
+    }
+
+    @Test
+    fun targetBasedAnimationIsSubscribed() {
+        checkUnsupportedIsSubscribed("TargetBasedAnimationPreview", listOf("TargetBasedAnimation"))
+    }
+
+    @Test
+    fun decayAnimationIsSubscribed() {
+        checkUnsupportedIsSubscribed("DecayAnimationPreview", listOf("DecayAnimation"))
+    }
+
+    @Test
+    fun infiniteTransitionIsSubscribed() {
+        checkUnsupportedIsSubscribed("InfiniteTransitionPreview", listOf("InfiniteTransition"))
+    }
+
+    private fun checkUnsupportedIsSubscribed(preview: String, labels: List<String>) {
+        val clock = PreviewAnimationClock()
+
+        activityTestRule.runOnUiThread {
+            composeViewAdapter.init(
+                "androidx.compose.ui.tooling.TestAnimationPreviewKt",
+                preview
+            )
+            composeViewAdapter.clock = clock
+            assertFalse(composeViewAdapter.hasAnimations())
+            assertTrue(clock.trackedTransitions.isEmpty())
+        }
+
+        waitFor("Composable to have animations", 1, TimeUnit.SECONDS) {
+            // Handle the case where onLayout was called too soon. Calling requestLayout will
+            // make sure onLayout will be called again.
+            composeViewAdapter.requestLayout()
+            composeViewAdapter.hasAnimations()
+        }
+
+        activityTestRule.runOnUiThread {
+            assertEquals(labels, clock.trackedUnsupported.map { it.label }.sortedBy { it })
+            assertEquals(0, clock.trackedTransitions.size)
+            assertEquals(0, clock.trackedAnimatedVisibility.size)
+        }
+    }
+
     @OptIn(InternalAnimationApi::class)
     private fun checkTransitionIsSubscribed(composableName: String, label: String) {
         val clock = PreviewAnimationClock()
diff --git a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
index b40c930..408d822 100644
--- a/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
+++ b/compose/ui/ui-tooling/src/androidAndroidTest/kotlin/androidx/compose/ui/tooling/TestAnimationPreview.kt
@@ -18,13 +18,37 @@
 
 import androidx.compose.animation.AnimatedContent
 import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.Crossfade
 import androidx.compose.animation.ExperimentalAnimationApi
+import androidx.compose.animation.animateContentSize
+import androidx.compose.animation.core.DecayAnimation
+import androidx.compose.animation.core.FloatExponentialDecaySpec
+import androidx.compose.animation.core.InfiniteTransition
 import androidx.compose.animation.core.LinearEasing
+import androidx.compose.animation.core.RepeatMode
+import androidx.compose.animation.core.Spring
+import androidx.compose.animation.core.StartOffset
+import androidx.compose.animation.core.StartOffsetType
+import androidx.compose.animation.core.TargetBasedAnimation
+import androidx.compose.animation.core.VectorConverter
 import androidx.compose.animation.core.animateDp
+import androidx.compose.animation.core.animateDpAsState
+import androidx.compose.animation.core.animateFloat
+import androidx.compose.animation.core.animateIntAsState
+import androidx.compose.animation.core.infiniteRepeatable
+import androidx.compose.animation.core.rememberInfiniteTransition
+import androidx.compose.animation.core.spring
 import androidx.compose.animation.core.tween
 import androidx.compose.animation.core.updateTransition
+import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.selection.toggleable
+import androidx.compose.foundation.shape.CircleShape
 import androidx.compose.foundation.shape.CornerSize
 import androidx.compose.material.Button
 import androidx.compose.material.Icon
@@ -35,12 +59,18 @@
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.Done
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
+import androidx.compose.runtime.withFrameNanos
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
 
 enum class CheckBoxState { Unselected, Selected }
@@ -123,3 +153,149 @@
         Icon(imageVector = Icons.Filled.Done, contentDescription = null)
     }
 }
+
+@Preview(name = "AnimateAsStatePreview")
+@Composable
+fun AnimateAsStatePreview() {
+    var showMenu by remember { mutableStateOf(true) }
+    var message by remember { mutableStateOf("Hello") }
+
+    val size: Dp by animateDpAsState(
+        targetValue = if (showMenu) 0.dp else 10.dp,
+        animationSpec = spring(Spring.DampingRatioHighBouncy, Spring.StiffnessHigh),
+    )
+    val offset by animateIntAsState(
+        targetValue = if (showMenu) 2 else 1
+    )
+
+    Box(
+        Modifier
+            .padding(size)
+            .offset(offset.dp)
+            .pointerInput(Unit) {
+                detectTapGestures {
+                    showMenu = !showMenu
+                    message += "!"
+                }
+            }) {
+        Text(text = message)
+    }
+}
+
+@Preview(name = "CrossFadePreview")
+@Composable
+fun CrossFadePreview() {
+    var currentPage by remember { mutableStateOf("A") }
+    Row {
+        Button(onClick = {
+            currentPage = when (currentPage) {
+                "A" -> "B"
+                "B" -> "A"
+                else -> "A"
+            }
+        }) {
+            Text("Switch Page")
+        }
+        Crossfade(targetState = currentPage) { screen ->
+            when (screen) {
+                "A" -> Text("Page A")
+                "B" -> Text("Page B")
+            }
+        }
+    }
+}
+
+@Preview(name = "AnimateContentSizePreview")
+@Composable
+fun AnimateContentSizePreview() {
+    var message by remember { mutableStateOf("Hello") }
+    Row {
+        var count by remember { mutableStateOf(0) }
+        Button(onClick = {
+            count++
+            message = "Count is $count"
+        }) {
+            Text("Add")
+        }
+        Box(
+            modifier = Modifier
+                .animateContentSize()
+        ) {
+            Text(text = message)
+        }
+    }
+}
+
+@Preview(name = "TargetBasedAnimationPreview")
+@Composable
+fun TargetBasedAnimationPreview() {
+    val anim = remember {
+        TargetBasedAnimation(
+            animationSpec = tween(200),
+            typeConverter = Float.VectorConverter,
+            initialValue = 200f,
+            targetValue = 1000f
+        )
+    }
+    var playTime by remember { mutableStateOf(0L) }
+
+    LaunchedEffect(anim) {
+        val startTime = withFrameNanos { it }
+
+        do {
+            playTime = withFrameNanos { it } - startTime
+        } while (playTime < 1_000_000L)
+    }
+    Box { Text(text = "Play time $playTime") }
+}
+
+@Preview(name = "DecayAnimationPreview")
+@Composable
+fun DecayAnimationPreview() {
+    val anim = remember {
+        DecayAnimation(
+            animationSpec = FloatExponentialDecaySpec(),
+            initialValue = 200f,
+        )
+    }
+    var playTime by remember { mutableStateOf(0L) }
+
+    LaunchedEffect(anim) {
+        val startTime = withFrameNanos { it }
+
+        do {
+            playTime = withFrameNanos { it } - startTime
+        } while (playTime < 1_000_000L)
+    }
+    Box { Text(text = "Play time $playTime") }
+}
+
+@Preview
+@Composable
+fun InfiniteTransitionPreview() {
+    val infiniteTransition = rememberInfiniteTransition()
+    Row {
+        infiniteTransition.PulsingDot(StartOffset(0))
+        infiniteTransition.PulsingDot(StartOffset(150, StartOffsetType.FastForward))
+        infiniteTransition.PulsingDot(StartOffset(300, StartOffsetType.FastForward))
+    }
+}
+
+@Composable
+fun InfiniteTransition.PulsingDot(startOffset: StartOffset) {
+    val scale by animateFloat(
+        0.2f,
+        1f,
+        infiniteRepeatable(tween(600), RepeatMode.Reverse, initialStartOffset = startOffset)
+    )
+    Box(
+        Modifier
+            .padding(5.dp)
+            .size(20.dp)
+            .graphicsLayer {
+                scaleX = scale
+                scaleY = scale
+            }
+            .background(Color.Gray, shape = CircleShape)
+    )
+}
\ No newline at end of file
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
index 5d07d1a..fe71638 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/ComposeViewAdapter.kt
@@ -69,10 +69,21 @@
 import androidx.savedstate.SavedStateRegistryOwner
 import androidx.savedstate.setViewTreeSavedStateRegistryOwner
 import java.lang.reflect.Method
+import androidx.compose.animation.core.Animatable
+import androidx.compose.animation.core.DecayAnimation
+import androidx.compose.animation.core.InfiniteTransition
+import androidx.compose.animation.core.TargetBasedAnimation
+import kotlin.reflect.KClass
+import kotlin.reflect.safeCast
 
 private const val TOOLS_NS_URI = "http://schemas.android.com/tools"
 private const val DESIGN_INFO_METHOD = "getDesignInfo"
 private const val UPDATE_TRANSITION_FUNCTION_NAME = "updateTransition"
+private const val ANIMATED_CONTENT = "AnimatedContent"
+private const val ANIMATED_VISIBILITY = "AnimatedVisibility"
+private const val ANIMATE_VALUE_AS_STATE = "animateValueAsState"
+private const val REMEMBER = "remember"
+private const val SIZE_ANIMATION_MODIFIER = "androidx.compose.animation.SizeAnimationModifier"
 
 private val emptyContent: @Composable () -> Unit = @Composable {}
 
@@ -263,6 +274,119 @@
         )
     }
 
+    /** Find first data with type [T] within all remember calls. */
+    private inline fun <reified T> Collection<Group>.findRememberCall(): List<T> {
+        val rememberCalls = mapNotNull { it.firstOrNull { call -> call.name == "remember" } }
+        return rememberCalls.mapNotNull {
+            it.data.firstOrNull { data ->
+                data is T
+            } as? T
+        }
+    }
+
+    /** Search for animations with type [T]. */
+    private open class Search<T : Any>(val trackAnimation: (Any) -> Unit) {
+        val animations = mutableSetOf<T>()
+        open fun parse(treeWithLocation: Collection<Group>) {}
+        fun hasAnimations() = animations.isNotEmpty()
+        fun track() {
+            animations.forEach { trackAnimation(it) }
+        }
+    }
+
+    /** Search for animations with type [T]. */
+    private open class RememberSearch<T : Any>(
+        private val clazz: KClass<T>,
+        trackAnimation: (Any) -> Unit
+    ) : Search<T>(trackAnimation) {
+        override fun parse(treeWithLocation: Collection<Group>) {
+            animations.addAll(treeWithLocation.findRememberCallWithType(clazz).toSet())
+        }
+
+        protected fun <T : Any> Collection<Group>.findRememberCallWithType(clazz: KClass<T>):
+            List<T> {
+            val rememberCalls = filter { call -> call.name == REMEMBER }
+            return rememberCalls.mapNotNull {
+                clazz.safeCast(
+                    it.data.firstOrNull { data -> data?.javaClass?.kotlin == clazz })
+            }
+        }
+    }
+
+    /** Search for animateXAsState() and animateValueAsState() animations. */
+    private inner class AnimateXAsStateSearch(trackAnimation: (Any) -> Unit) :
+        Search<Animatable<*, *>>(trackAnimation) {
+        override fun parse(treeWithLocation: Collection<Group>) {
+            // How "animateXAsState" calls organized:
+            // Group with name "animateXAsState", for example animateDpAsState, animateIntAsState
+            //    children
+            //    * Group with name "animateValueAsState"
+            //          children
+            //          * Group with name "remember" and data with type Animatable
+            //
+            // To distinguish Animatable within "animateXAsState" calls from other Animatables,
+            // first "animateValueAsState" calls are found.
+            //  Find Animatable within "animateValueAsState" call.
+            animations.addAll(
+                treeWithLocation.filter { call -> call.name == ANIMATE_VALUE_AS_STATE }
+                    .mapNotNull { animateValue ->
+                        animateValue.children.findRememberCall<Animatable<*, *>>().firstOrNull()
+                    }.toSet()
+            )
+        }
+    }
+
+    /** Search for animateContentSize() animations. */
+    private class AnimateContentSizeSearch(trackAnimation: (Any) -> Unit) :
+        Search<Any>(trackAnimation) {
+        override fun parse(treeWithLocation: Collection<Group>) {
+            animations.addAll(treeWithLocation.filter { call -> call.name == REMEMBER }.mapNotNull {
+                // SizeAnimationModifier is currently private.
+                it.data.firstOrNull { data ->
+                    data?.javaClass?.name == SIZE_ANIMATION_MODIFIER
+                }
+            }.toSet())
+        }
+    }
+
+    /** Search for updateTransition() animations. */
+    private inner class TransitionSearch(trackAnimation: (Any) -> Unit) :
+        Search<Transition<Any>>(trackAnimation) {
+        override fun parse(treeWithLocation: Collection<Group>) {
+            // Find `updateTransition` calls.
+            animations.addAll(treeWithLocation.filter { it.name == UPDATE_TRANSITION_FUNCTION_NAME }
+                .findRememberCall())
+        }
+    }
+
+    /** Search for AnimatedVisibility animations. */
+    private inner class AnimatedVisibilitySearch(trackAnimation: (Any) -> Unit) :
+        Search<Transition<Any>>(trackAnimation) {
+        override fun parse(treeWithLocation: Collection<Group>) {
+            // Find `AnimatedVisibility` calls.
+            // Then, find the underlying `updateTransition` it uses.
+            animations.addAll(treeWithLocation.filter { it.name == ANIMATED_VISIBILITY }
+                .mapNotNull {
+                    it.children.firstOrNull { updateTransitionCall ->
+                        updateTransitionCall.name == UPDATE_TRANSITION_FUNCTION_NAME
+                    }
+                }.findRememberCall())
+        }
+    }
+
+    /** Search for AnimatedContent animations. */
+    private inner class AnimatedContentSearch(trackAnimation: (Any) -> Unit) :
+        Search<Transition<Any>>(trackAnimation) {
+        override fun parse(treeWithLocation: Collection<Group>) {
+            animations.addAll(treeWithLocation.filter { it.name == ANIMATED_CONTENT }
+                .mapNotNull {
+                    it.children.firstOrNull { updateTransitionCall ->
+                        updateTransitionCall.name == UPDATE_TRANSITION_FUNCTION_NAME
+                    }
+                }.findRememberCall())
+        }
+    }
+
     /**
      * Processes the recorded slot table and re-generates the [viewInfos] attribute.
      */
@@ -285,8 +409,7 @@
 
         processViewInfos()
         if (composableName.isNotEmpty()) {
-            // TODO(b/160126628): support other APIs, e.g. animate
-            findAndTrackTransitions()
+            findAndTrackAnimations()
             if (lookForDesignInfoProviders) {
                 findDesignInfoProviders()
             }
@@ -299,75 +422,59 @@
     }
 
     /**
-     * Finds all the transition animations defined in the Compose tree where the root is the
+     * Finds all animations defined in the Compose tree where the root is the
      * `@Composable` being previewed. We only return animations defined in the user code, i.e.
      * the ones we've got source information for.
      */
     @Suppress("UNCHECKED_CAST")
-    private fun findAndTrackTransitions() {
-        @Suppress("UNCHECKED_CAST")
-        fun List<Group>.findTransitionObjects(): List<Transition<Any>> {
-            val rememberCalls = mapNotNull { it.firstOrNull { call -> call.name == "remember" } }
-            return rememberCalls.mapNotNull {
-                it.data.firstOrNull { data ->
-                    data is Transition<*>
-                } as? Transition<Any>
-            }
+    private fun findAndTrackAnimations() {
+        val slotTrees = slotTableRecord.store.map { it.asTree() }
+        val transitionSearch = TransitionSearch { clock.trackTransition(it as Transition<Any>) }
+        val animatedContentSearch =
+            AnimatedContentSearch { clock.trackAnimatedContent(it as Transition<*>) }
+        val animatedVisibilitySearch = AnimatedVisibilitySearch {
+            clock.trackAnimatedVisibility(it as Transition<Any>, ::requestLayout)
         }
 
-        val slotTrees = slotTableRecord.store.map { it.asTree() }
-        val transitions = mutableSetOf<Transition<Any>>()
-        val animatedVisibilityParentTransitions = mutableSetOf<Transition<Any>>()
-        val animatedContentParentTransitions = mutableSetOf<Transition<Any>>()
+        val search = listOf(
+            transitionSearch,
+            animatedVisibilitySearch,
+            animatedContentSearch,
+            AnimateXAsStateSearch { clock.trackAnimateXAsState(it as Animatable<*, *>) },
+            AnimateContentSizeSearch { clock.trackAnimateContentSize(it) },
+            RememberSearch(TargetBasedAnimation::class) {
+                clock.trackTargetBasedAnimations(it as TargetBasedAnimation<*, *>)
+            },
+            RememberSearch(DecayAnimation::class) {
+                clock.trackDecayAnimations(it as DecayAnimation<*, *>)
+            },
+            RememberSearch(InfiniteTransition::class) {
+                clock.trackInfiniteTransition(it as InfiniteTransition)
+            }
+        )
+
         // Check all the slot tables, since some animations might not be present in the same
         // table as the one containing the `@Composable` being previewed, e.g. when they're
         // defined using sub-composition.
         slotTrees.forEach { tree ->
-            transitions.addAll(
-                // Find `updateTransition` calls in the user code, i.e. when source location is
-                // known.
-                tree.findAll { it.name == UPDATE_TRANSITION_FUNCTION_NAME && it.location != null }
-                    .findTransitionObjects()
-            )
-            // Find `AnimatedVisibility` calls in the user code, i.e. when source location is
-            // known. Then, find the underlying `updateTransition` it uses.
-            animatedVisibilityParentTransitions.addAll(
-                tree.findAll {
-                    it.name == "AnimatedVisibility" && it.location != null
-                }.mapNotNull {
-                    it.children.firstOrNull { updateTransitionCall ->
-                        updateTransitionCall.name == UPDATE_TRANSITION_FUNCTION_NAME
-                    }
-                }.findTransitionObjects()
-            )
-
-            animatedContentParentTransitions.addAll(
-                tree.findAll {
-                    it.name == "AnimatedContent" && it.location != null
-                }.mapNotNull {
-                    it.children.firstOrNull { updateTransitionCall ->
-                        updateTransitionCall.name == UPDATE_TRANSITION_FUNCTION_NAME
-                    }
-                }.findTransitionObjects()
-            )
+            val treeWithLocation = tree.findAll { it.location != null }
+            search.forEach { it.parse(treeWithLocation) }
 
             // Remove all AnimatedVisibility parent transitions from the transitions list,
             // otherwise we'd duplicate them in the Android Studio Animation Preview because we
             // will track them separately.
-            transitions.removeAll(animatedVisibilityParentTransitions)
+            transitionSearch.animations.removeAll(animatedVisibilitySearch.animations)
 
             // Remove all AnimatedContent parent transitions from the transitions list, so we can
             // ignore these animations while support is not added to Animation Preview.
-            transitions.removeAll(animatedContentParentTransitions)
+            transitionSearch.animations.removeAll(animatedContentSearch.animations)
         }
 
-        hasAnimations = transitions.isNotEmpty() || animatedVisibilityParentTransitions.isNotEmpty()
+        hasAnimations = search.any { it.hasAnimations() }
+
         // Make the `PreviewAnimationClock` track all the transitions found.
         if (::clock.isInitialized) {
-            transitions.forEach { clock.trackTransition(it) }
-            animatedVisibilityParentTransitions.forEach {
-                clock.trackAnimatedVisibility(it, ::requestLayout)
-            }
+            search.forEach { it.track() }
         }
     }
 
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
index 5410d75..abc83a1 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/ComposeAnimationParser.kt
@@ -71,6 +71,17 @@
 }
 
 /**
+ * [ComposeAnimation] of type [ComposeAnimationType.UNSUPPORTED].
+ */
+internal class UnsupportedComposeAnimation(
+    override val label: String?
+) : ComposeAnimation {
+    override val type = ComposeAnimationType.UNSUPPORTED
+    override val animationObject: Any = 0
+    override val states = emptySet<Int>()
+}
+
+/**
  * Represents the states of [AnimatedVisibilityComposeAnimation]s.
  */
 @JvmInline
diff --git a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
index 573818c..4329d4f 100644
--- a/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
+++ b/compose/ui/ui-tooling/src/androidMain/kotlin/androidx/compose/ui/tooling/animation/PreviewAnimationClock.kt
@@ -18,6 +18,7 @@
 
 import android.util.Log
 import androidx.annotation.VisibleForTesting
+import androidx.compose.animation.core.Animatable
 import androidx.compose.animation.core.Transition
 import androidx.compose.animation.core.TweenSpec
 import androidx.compose.animation.core.SnapSpec
@@ -25,7 +26,10 @@
 import androidx.compose.animation.core.InfiniteRepeatableSpec
 import androidx.compose.animation.core.KeyframesSpec
 import androidx.compose.animation.core.AnimationVector
+import androidx.compose.animation.core.DecayAnimation
+import androidx.compose.animation.core.InfiniteTransition
 import androidx.compose.animation.core.StartOffsetType
+import androidx.compose.animation.core.TargetBasedAnimation
 import androidx.compose.animation.core.VectorizedDurationBasedAnimationSpec
 import androidx.compose.animation.tooling.ComposeAnimatedProperty
 import androidx.compose.animation.tooling.ComposeAnimation
@@ -70,6 +74,10 @@
     @VisibleForTesting
     internal val trackedAnimatedVisibility = hashSetOf<AnimatedVisibilityComposeAnimation>()
 
+    /** Set of detected but not supported animations. */
+    @VisibleForTesting
+    internal val trackedUnsupported = hashSetOf<UnsupportedComposeAnimation>()
+
     /**
      * Maps [Transition]s to their corresponding cached [TransitionState], which we use to seek
      * the animations when updating the clock time.
@@ -86,6 +94,55 @@
     internal val animatedVisibilityStates = hashMapOf<Transition<Any>, AnimatedVisibilityState>()
     private val animatedVisibilityStatesLock = Any()
 
+    private val animateXAsStateSubscriber =
+        UnsupportedComposeAnimationSubscriber<Animatable<*, *>>()
+
+    private val animateContentSizeSubscriber = UnsupportedComposeAnimationSubscriber<Any>()
+
+    private val targetBasedAnimationSubscriber =
+        UnsupportedComposeAnimationSubscriber<TargetBasedAnimation<*, *>>()
+
+    private val decayAnimationSubscriber =
+        UnsupportedComposeAnimationSubscriber<DecayAnimation<*, *>>()
+
+    private val animatedContentSubscriber = UnsupportedComposeAnimationSubscriber<Transition<*>>()
+
+    private val infiniteTransitionSubscriber =
+        UnsupportedComposeAnimationSubscriber<InfiniteTransition>()
+
+    /**
+     * Keeps and subscribes the list of unsupported animations.
+     * Each animation can only be subscribed once.
+     */
+    private inner class UnsupportedComposeAnimationSubscriber<T> {
+        private val animations = mutableSetOf<T>()
+        private val lock = Any()
+
+        fun trackAnimation(animation: T, label: String) {
+            synchronized(lock) {
+                if (animations.contains(animation)) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Animation $animation is already being tracked")
+                    }
+                    return@trackAnimation
+                }
+                animations.add(animation)
+            }
+
+            if (DEBUG) {
+                Log.d(TAG, "Animation $animation is now tracked")
+            }
+
+            val composeAnimation = UnsupportedComposeAnimation(label)
+            trackedUnsupported.add(composeAnimation)
+            notifySubscribe(composeAnimation)
+        }
+
+        fun clear() {
+            animations.clear()
+        }
+    }
+
     fun trackTransition(transition: Transition<Any>) {
         synchronized(transitionStatesLock) {
             if (transitionStates.containsKey(transition)) {
@@ -141,6 +198,31 @@
         notifySubscribe(composeAnimation)
     }
 
+    fun trackAnimateXAsState(animatable: Animatable<*, *>) {
+        // TODO(b/240919893) Use label from animatable.
+        animateXAsStateSubscriber.trackAnimation(animatable, "animateValueAsState")
+    }
+
+    fun trackAnimateContentSize(sizeAnimationModifier: Any) {
+        animateContentSizeSubscriber.trackAnimation(sizeAnimationModifier, "animateContentSize")
+    }
+
+    fun trackTargetBasedAnimations(targetBasedAnimation: TargetBasedAnimation<*, *>) {
+        targetBasedAnimationSubscriber.trackAnimation(targetBasedAnimation, "TargetBasedAnimation")
+    }
+
+    fun trackDecayAnimations(decayAnimation: DecayAnimation<*, *>) {
+        decayAnimationSubscriber.trackAnimation(decayAnimation, "DecayAnimation")
+    }
+
+    fun trackAnimatedContent(animatedContent: Transition<*>) {
+        animatedContentSubscriber.trackAnimation(animatedContent, "AnimatedContent")
+    }
+
+    fun trackInfiniteTransition(infiniteTransition: InfiniteTransition) {
+        infiniteTransitionSubscriber.trackAnimation(infiniteTransition, "InfiniteTransition")
+    }
+
     @VisibleForTesting
     protected open fun notifySubscribe(animation: ComposeAnimation) {
         // This method is expected to be no-op. It is intercepted in Android Studio using bytecode
@@ -318,11 +400,20 @@
     fun dispose() {
         trackedTransitions.forEach { notifyUnsubscribe(it) }
         trackedAnimatedVisibility.forEach { notifyUnsubscribe(it) }
+        trackedUnsupported.forEach { notifyUnsubscribe(it) }
 
         trackedAnimatedVisibility.clear()
         trackedTransitions.clear()
         animatedVisibilityStates.clear()
         transitionStates.clear()
+        // Clear information about unsupported animations
+        trackedUnsupported.clear()
+        animatedContentSubscriber.clear()
+        animateXAsStateSubscriber.clear()
+        targetBasedAnimationSubscriber.clear()
+        decayAnimationSubscriber.clear()
+        animateContentSizeSubscriber.clear()
+        infiniteTransitionSubscriber.clear()
     }
 
     @VisibleForTesting
diff --git a/compose/ui/ui-unit/samples/build.gradle b/compose/ui/ui-unit/samples/build.gradle
index 6b72c965..66f3c59 100644
--- a/compose/ui/ui-unit/samples/build.gradle
+++ b/compose/ui/ui-unit/samples/build.gradle
@@ -29,7 +29,7 @@
 
     compileOnly(project(":annotation:annotation-sampled"))
 
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation(project(":compose:ui:ui"))
     implementation(project(":compose:ui:ui-unit"))
     implementation(project(":compose:foundation:foundation"))
diff --git a/compose/ui/ui-viewbinding/samples/build.gradle b/compose/ui/ui-viewbinding/samples/build.gradle
index 80f902e..25b7bf6 100644
--- a/compose/ui/ui-viewbinding/samples/build.gradle
+++ b/compose/ui/ui-viewbinding/samples/build.gradle
@@ -27,7 +27,7 @@
 
     implementation(libs.kotlinStdlib)
     compileOnly(project(":annotation:annotation-sampled"))
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation(project(":compose:ui:ui"))
     implementation(project(":compose:ui:ui-viewbinding"))
     // Used when creating layouts that contain a FragmentContainerView
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index b45cd1e..d01baf1 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -39,8 +39,8 @@
         implementation(libs.kotlinCoroutinesCore)
 
         // when updating the runtime version please also update the runtime-saveable version
-        implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
-        api("androidx.compose.runtime:runtime-saveable:1.2.0-rc02")
+        implementation("androidx.compose.runtime:runtime:1.2.0")
+        api("androidx.compose.runtime:runtime-saveable:1.2.0")
 
         api(project(":compose:ui:ui-geometry"))
         api(project(":compose:ui:ui-graphics"))
@@ -59,12 +59,12 @@
 
         implementation("androidx.core:core:1.5.0")
         implementation('androidx.collection:collection:1.0.0')
-        implementation("androidx.customview:customview-poolingcontainer:1.0.0-rc01")
-        implementation("androidx.savedstate:savedstate-ktx:1.2.0-rc01")
+        implementation("androidx.customview:customview-poolingcontainer:1.0.0")
+        implementation("androidx.savedstate:savedstate-ktx:1.2.0")
         implementation("androidx.lifecycle:lifecycle-common-java8:2.3.0")
         implementation("androidx.lifecycle:lifecycle-runtime:2.3.0")
         implementation("androidx.lifecycle:lifecycle-viewmodel:2.3.0")
-        implementation("androidx.profileinstaller:profileinstaller:1.2.0-rc01")
+        implementation("androidx.profileinstaller:profileinstaller:1.2.0")
 
         testImplementation(libs.testRules)
         testImplementation(libs.testRunner)
@@ -150,8 +150,8 @@
                 implementation("androidx.autofill:autofill:1.0.0")
                 implementation(libs.kotlinCoroutinesAndroid)
 
-                implementation("androidx.customview:customview-poolingcontainer:1.0.0-rc01")
-                implementation("androidx.savedstate:savedstate-ktx:1.2.0-rc01")
+                implementation("androidx.customview:customview-poolingcontainer:1.0.0")
+                implementation("androidx.savedstate:savedstate-ktx:1.2.0")
                 implementation("androidx.lifecycle:lifecycle-common-java8:2.3.0")
                 implementation("androidx.lifecycle:lifecycle-runtime:2.3.0")
                 implementation("androidx.lifecycle:lifecycle-viewmodel:2.3.0")
diff --git a/compose/ui/ui/samples/build.gradle b/compose/ui/ui/samples/build.gradle
index 7cf725d..8a620d9 100644
--- a/compose/ui/ui/samples/build.gradle
+++ b/compose/ui/ui/samples/build.gradle
@@ -31,10 +31,10 @@
 
     compileOnly(project(":annotation:annotation-sampled"))
 
-    implementation("androidx.compose.animation:animation-core:1.2.0-rc02")
+    implementation("androidx.compose.animation:animation-core:1.2.0")
     implementation("androidx.compose.foundation:foundation-layout:1.0.0")
     implementation("androidx.compose.material:material:1.0.0")
-    implementation("androidx.compose.runtime:runtime:1.2.0-rc02")
+    implementation("androidx.compose.runtime:runtime:1.2.0")
     implementation(project(":compose:ui:ui"))
 }
 
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt
index d01220f..b95a4d2 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchNextTest.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.focus
 
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.focus.FocusDirection.Companion.Next
@@ -405,6 +406,81 @@
     }
 
     @Test
+    fun focusNextOrderAmongChildrenOfMultipleParents() {
+        // Arrange.
+        val focusState = List(12) { mutableStateOf(false) }
+        rule.setContentForTest {
+            Column {
+                Row {
+                    FocusableBox(focusState[0], 0, 0, 10, 10, initialFocus)
+                    FocusableBox(focusState[1], 10, 0, 10, 10)
+                    FocusableBox(focusState[2], 20, 0, 10, 10)
+                    FocusableBox(focusState[3], 30, 0, 10, 10)
+                }
+                Row {
+                    FocusableBox(focusState[4], 0, 10, 10, 10)
+                    FocusableBox(focusState[5], 10, 10, 10, 10)
+                    FocusableBox(focusState[6], 20, 10, 10, 10)
+                    FocusableBox(focusState[7], 30, 10, 10, 10)
+                }
+                Row {
+                    FocusableBox(focusState[8], 0, 20, 10, 10)
+                    FocusableBox(focusState[9], 10, 20, 10, 10)
+                    FocusableBox(focusState[10], 20, 20, 10, 10)
+                    FocusableBox(focusState[11], 30, 20, 10, 10)
+                }
+            }
+        }
+
+        for (itemNumber in 1..11) {
+
+            // Act.
+            rule.runOnIdle { focusManager.moveFocus(Next) }
+
+            // Assert.
+            rule.runOnIdle { assertThat(focusState[itemNumber].value).isTrue() }
+        }
+    }
+
+    @Test
+    fun focusNextOrderAmongChildrenAtMultipleLevels() {
+        // Arrange.
+        val focusState = List(14) { mutableStateOf(false) }
+        rule.setContentForTest {
+            Column {
+                FocusableBox(focusState[0], 0, 0, 10, 10, initialFocus)
+                FocusableBox(focusState[1], 0, 10, 10, 10)
+                Row {
+                    FocusableBox(focusState[2], 0, 20, 10, 10)
+                    FocusableBox(focusState[3], 10, 20, 10, 10)
+                    Column {
+                        FocusableBox(focusState[4], 20, 20, 10, 10)
+                        FocusableBox(focusState[5], 20, 30, 10, 10)
+                        Row {
+                            FocusableBox(focusState[6], 20, 40, 10, 10)
+                            FocusableBox(focusState[7], 30, 40, 10, 10)
+                        }
+                        FocusableBox(focusState[8], 20, 50, 10, 10)
+                        FocusableBox(focusState[9], 20, 50, 10, 10)
+                    }
+                    FocusableBox(focusState[10], 20, 20, 10, 10)
+                    FocusableBox(focusState[11], 30, 20, 10, 10)
+                }
+                FocusableBox(focusState[12], 0, 30, 10, 10)
+                FocusableBox(focusState[13], 0, 40, 10, 10)
+            }
+        }
+
+        for (itemNumber in 1..13) {
+            // Act.
+            rule.runOnIdle { focusManager.moveFocus(Next) }
+
+            // Assert.
+            rule.runOnIdle { assertThat(focusState[itemNumber].value).isTrue() }
+        }
+    }
+
+    @Test
     fun focusNextOrdering() {
         // Arrange.
         val (parent1, child1, child2, child3) = List(4) { mutableStateOf(false) }
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt
index f72f331..081774d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearchPreviousTest.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.focus
 
 import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.focus.FocusDirection.Companion.Previous
@@ -405,6 +406,80 @@
     }
 
     @Test
+    fun focusNextOrderAmongChildrenOfMultipleParents() {
+        // Arrange.
+        val focusState = List(12) { mutableStateOf(false) }
+        rule.setContentForTest {
+            Column {
+                Row {
+                    FocusableBox(focusState[0], 0, 0, 10, 10)
+                    FocusableBox(focusState[1], 10, 0, 10, 10)
+                    FocusableBox(focusState[2], 20, 0, 10, 10)
+                    FocusableBox(focusState[3], 30, 0, 10, 10)
+                }
+                Row {
+                    FocusableBox(focusState[4], 0, 10, 10, 10)
+                    FocusableBox(focusState[5], 10, 10, 10, 10)
+                    FocusableBox(focusState[6], 20, 10, 10, 10)
+                    FocusableBox(focusState[7], 30, 10, 10, 10)
+                }
+                Row {
+                    FocusableBox(focusState[8], 0, 20, 10, 10)
+                    FocusableBox(focusState[9], 10, 20, 10, 10)
+                    FocusableBox(focusState[10], 20, 20, 10, 10)
+                    FocusableBox(focusState[11], 30, 20, 10, 10, initialFocus)
+                }
+            }
+        }
+
+        for (itemNumber in 10 downTo 0) {
+            // Act.
+            rule.runOnIdle { focusManager.moveFocus(Previous) }
+
+            // Assert.
+            rule.runOnIdle { assertThat(focusState[itemNumber].value).isTrue() }
+        }
+    }
+
+    @Test
+    fun focusNextOrderAmongChildrenAtMultipleLevels() {
+        // Arrange.
+        val focusState = List(14) { mutableStateOf(false) }
+        rule.setContentForTest {
+            Column {
+                FocusableBox(focusState[0], 0, 0, 10, 10)
+                FocusableBox(focusState[1], 0, 10, 10, 10)
+                Row {
+                    FocusableBox(focusState[2], 0, 20, 10, 10)
+                    FocusableBox(focusState[3], 10, 20, 10, 10)
+                    Column {
+                        FocusableBox(focusState[4], 20, 20, 10, 10)
+                        FocusableBox(focusState[5], 20, 30, 10, 10)
+                        Row {
+                            FocusableBox(focusState[6], 20, 40, 10, 10)
+                            FocusableBox(focusState[7], 30, 40, 10, 10)
+                        }
+                        FocusableBox(focusState[8], 20, 50, 10, 10)
+                        FocusableBox(focusState[9], 20, 50, 10, 10)
+                    }
+                    FocusableBox(focusState[10], 20, 20, 10, 10)
+                    FocusableBox(focusState[11], 30, 20, 10, 10)
+                }
+                FocusableBox(focusState[12], 0, 30, 10, 10)
+                FocusableBox(focusState[13], 0, 40, 10, 10, initialFocus)
+            }
+        }
+
+        for (itemNumber in 12 downTo 0) {
+            // Act.
+            rule.runOnIdle { focusManager.moveFocus(Previous) }
+
+            // Assert.
+            rule.runOnIdle { assertThat(focusState[itemNumber].value).isTrue() }
+        }
+    }
+
+    @Test
     fun focusPreviousOrdering() {
         // Arrange.
         val (parent1, child1, child2, child3) = List(4) { mutableStateOf(false) }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
index bd668d4..e31773d 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/OneDimensionalFocusSearch.kt
@@ -17,6 +17,7 @@
 package androidx.compose.ui.focus
 
 import androidx.compose.runtime.collection.MutableVector
+import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.ui.focus.FocusDirection.Companion.Next
 import androidx.compose.ui.focus.FocusDirection.Companion.Previous
 import androidx.compose.ui.focus.FocusStateImpl.Active
@@ -25,6 +26,8 @@
 import androidx.compose.ui.focus.FocusStateImpl.Deactivated
 import androidx.compose.ui.focus.FocusStateImpl.DeactivatedParent
 import androidx.compose.ui.focus.FocusStateImpl.Inactive
+import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.node.LayoutNodeWrapper
 import kotlin.contracts.ExperimentalContracts
 import kotlin.contracts.contract
 
@@ -118,7 +121,7 @@
     check(focusState == ActiveParent || focusState == DeactivatedParent) {
         "This function should only be used within a parent that has focus."
     }
-    children.sort()
+    children.sortWith(FocusableChildrenComparator)
     when (direction) {
         Next -> children.forEachItemAfter(focusedItem) { child ->
             if (child.isEligibleForFocusSearch && child.forwardFocusSearch(onFound)) return true
@@ -141,14 +144,14 @@
 private fun FocusModifier.pickChildForForwardSearch(
     onFound: (FocusModifier) -> Boolean
 ): Boolean {
-    children.sort()
+    children.sortWith(FocusableChildrenComparator)
     return children.any { it.isEligibleForFocusSearch && it.forwardFocusSearch(onFound) }
 }
 
 private fun FocusModifier.pickChildForBackwardSearch(
     onFound: (FocusModifier) -> Boolean
 ): Boolean {
-    children.sort()
+    children.sortWith(FocusableChildrenComparator)
     children.forEachReversed {
         if (it.isEligibleForFocusSearch && it.backwardFocusSearch(onFound)) {
             return true
@@ -190,7 +193,7 @@
 }
 
 /**
- * Sort the focus modifiers. in place order
+ * We use this comparator to sort the focus modifiers in place order.
  *
  * We want to visit the nodes in placement order instead of composition order.
  * This is because components like LazyList reuse nodes without re-composing them, but it always
@@ -202,6 +205,37 @@
  * order index. This would be more expensive than sorting the items. In addition to this, sorting
  * the items makes the next focus search more efficient.
  */
-private fun MutableVector<FocusModifier>.sort() {
-    sortWith(compareBy { it.layoutNodeWrapper?.layoutNode?.placeOrder })
+private object FocusableChildrenComparator : Comparator<FocusModifier> {
+    override fun compare(focusModifier1: FocusModifier?, focusModifier2: FocusModifier?): Int {
+        requireNotNull(focusModifier1)
+        requireNotNull(focusModifier2)
+        if (focusModifier1 === focusModifier2) return 0
+
+        // Ignore non-attached focus modifiers as they won't be considered during focus search.
+        val wrapper1 = focusModifier1.layoutNodeWrapper ?: return 0
+        val wrapper2 = focusModifier2.layoutNodeWrapper ?: return 0
+
+        // Compare the place order of the children of the least common ancestor.
+        val pathFromRoot1 = pathFromRoot(wrapper1)
+        val pathFromRoot2 = pathFromRoot(wrapper2)
+        for (depth in 0..minOf(pathFromRoot1.lastIndex, pathFromRoot2.lastIndex)) {
+            // If the items from the two paths are not equal, we have
+            // found the first two children after the least common ancestor.
+            // We use the place order of these two parents to compare the focus modifiers.
+            if (pathFromRoot1[depth] != pathFromRoot2[depth]) {
+                return pathFromRoot1[depth].placeOrder.compareTo(pathFromRoot2[depth].placeOrder)
+            }
+        }
+        error("Could not find a common ancestor between the two FocusModifiers.")
+    }
+
+    private fun pathFromRoot(layoutNodeWrapper: LayoutNodeWrapper): MutableVector<LayoutNode> {
+        val path = mutableVectorOf<LayoutNode>()
+        var current: LayoutNode? = layoutNodeWrapper.layoutNode
+        while (current != null) {
+            path.add(0, current)
+            current = current.parent
+        }
+        return path
+    }
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
index 2d75ffa..5e52c4c 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
@@ -376,6 +376,9 @@
  * The [position] represents the position of the pointer relative to the element that
  * this [PointerInputChange] is being dispatched to.
  *
+ * Note: The [position] values can be outside the actual bounds of the element itself meaning the
+ * numbers can be negative or larger than the element bounds.
+ *
  * The [previousPosition] represents the position of the pointer offset to the current
  * position of the pointer relative to the screen.
  *
@@ -392,7 +395,7 @@
  * @param uptimeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
  * is platform-dependent
  * @param position The [Offset] of the current pointer event, relative to the containing
- * element
+ * element (values can be negative or larger than the element bounds).
  * @param pressed `true` if the pointer event is considered "pressed." For example, finger
  * touching the screen or a mouse button is pressed [pressed] would be `true`.
  * @param previousUptimeMillis The [uptimeMillis] of the previous pointer event
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt
index 2f31e6d..9da5ab4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/OnRemeasuredModifier.kt
@@ -26,16 +26,17 @@
 import androidx.compose.ui.internal.JvmDefaultWithCompatibility
 
 /**
- * Invoke [onSizeChanged] when the size of the modifier immediately after it has changed. If
- * there is no modifier following [onSizeChanged], the content size of the layout is reported.
+ * Invoked with the size of the modified Compose UI element when the element is first measured or
+ * when the size of the element changes.
  *
- * There are no guarantees [onSizeChanged] will not be re-invoked with the same size.
+ * There are no guarantees `onSizeChanged` will not be re-invoked with the same size.
  *
- * Use [Layout] or [SubcomposeLayout] to have the size of one component affect the size
- * of another component. Using the size received from the [onSizeChanged] callback in a
- * [MutableState] to affect layout will cause the new value to be recomposed and read only in the
- * following frame, causing a one frame lag. You can use [onSizeChanged] to affect
- * drawing operations.
+ * Using the `onSizeChanged` size value in a [MutableState] to update layout causes the new size
+ * value to be read and the layout to be recomposed in the succeeding frame, resulting in a one
+ * frame lag.
+ *
+ * You can use `onSizeChanged` to affect drawing operations. Use [Layout] or [SubcomposeLayout] to
+ * enable the size of one component to affect the size of another.
  *
  * Example usage:
  * @sample androidx.compose.ui.samples.OnSizeChangedSample
diff --git a/core/core-animation/lint-baseline.xml b/core/core-animation/lint-baseline.xml
index bd6b323..d3b9273 100644
--- a/core/core-animation/lint-baseline.xml
+++ b/core/core-animation/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="ResourceType"
diff --git a/core/core-appdigest/lint-baseline.xml b/core/core-appdigest/lint-baseline.xml
index 0907387..f90928c 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="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-i18n/src/main/java/androidx/core/i18n/messageformat_icu/simple/PluralRules.java b/core/core-i18n/src/main/java/androidx/core/i18n/messageformat_icu/simple/PluralRules.java
index 792a18f..ab9643d 100644
--- a/core/core-i18n/src/main/java/androidx/core/i18n/messageformat_icu/simple/PluralRules.java
+++ b/core/core-i18n/src/main/java/androidx/core/i18n/messageformat_icu/simple/PluralRules.java
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2007-2014, International Business Machines Corporation and
+ * Copyright (C) 2007-2016, International Business Machines Corporation and
  * others. All Rights Reserved.
  *******************************************************************************
  */
@@ -46,13 +46,13 @@
  * </p>
  * <p>
  * For more information, details, and tips for writing rules, see the <a
- * href="http://www.unicode.org/draft/reports/tr35/tr35.html#Language_Plural_Rules">LDML spec, C.11 Language Plural
- * Rules</a>
+ * href="https://www.unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules">LDML spec,
+ * Part 3.5 Language Plural Rules</a>
  * </p>
  * <p>
  * Examples:
  * </p>
- * 
+ *
  * <pre>
  * &quot;one: n is 1; few: n in 2..4&quot;
  * </pre>
@@ -62,7 +62,7 @@
  * between 2 and 4 inclusive - and be an integer - for this condition to pass. All other numbers are assigned the
  * keyword "other" by the default rule.
  * </p>
- * 
+ *
  * <pre>
  * &quot;zero: n is 0; one: n is 1; zero: n mod 100 in 1..19&quot;
  * </pre>
@@ -71,7 +71,7 @@
  * keyword whose condition passes is the one returned. Also notes that a modulus is applied to n in the last rule. Thus
  * its condition holds for 119, 219, 319...
  * </p>
- * 
+ *
  * <pre>
  * &quot;one: n is 1; few: n mod 10 in 2..4 and n mod 100 not in 12..14&quot;
  * </pre>
@@ -162,7 +162,7 @@
  * includes all values. Using 'within' with a range_list consisting entirely of values is the same as using 'in' (it's
  * not an error).
  * </p>
- * 
+ *
  * icu_annot::stable ICU 3.8
  * @hide
  */
@@ -172,18 +172,8 @@
     // static final UnicodeSet ALLOWED_ID = new UnicodeSet("[a-z]").freeze();
 
     // TODO Remove RulesList by moving its API and fields into PluralRules.
-    /**
-     * icu_annot::internal
-     * This API is ICU internal only.
-     */
-    // @Deprecated: in fact internal ICU
-    public static final String CATEGORY_SEPARATOR = ";  ";
-    /**
-     * icu_annot::internal
-     * This API is ICU internal only.
-     */
-    // @Deprecated: in fact internal ICU
-    public static final String KEYWORD_RULE_SEPARATOR = ": ";
+
+    private static final String CATEGORY_SEPARATOR = ";  ";
 
     private static final long serialVersionUID = 1;
 
@@ -192,19 +182,20 @@
 
     /**
      * Provides a factory for returning plural rules
-     * 
-     * icu_annot::internal
+     *
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
     public static abstract class Factory {
         /**
          * Provides access to the predefined <code>PluralRules</code> for a given locale and the plural type.
-         * 
+         *
          * <p>
          * ICU defines plural rules for many locales based on CLDR <i>Language Plural Rules</i>. For these predefined
-         * rules, see CLDR page at http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
-         * 
+         * rules, see CLDR page at
+         * https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html
+         *
          * @param locale
          *            The locale for which a <code>PluralRules</code> object is returned.
          * @param type
@@ -212,7 +203,7 @@
          * @return The predefined <code>PluralRules</code> object for this locale. If there's no predefined rules for
          *         this locale, the rules for the closest parent in the locale hierarchy that has one will be returned.
          *         The final fallback always returns the default rules.
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -222,7 +213,7 @@
          * Utility for getting CARDINAL rules.
          * @param locale the locale
          * @return plural rules.
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -232,8 +223,8 @@
 
         /**
          * Returns the locales for which there is plurals data.
-         * 
-         * icu_annot::internal
+         *
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
         @Deprecated
         public abstract ULocale[] getAvailableULocales();
@@ -245,14 +236,14 @@
          * All locales with the same functionally equivalent locale have plural rules that behave the same. This is not
          * exhaustive; there may be other locales whose plural rules behave the same that do not have the same equivalent
          * locale.
-         * 
+         *
          * @param locale
          *            the locale to check
          * @param isAvailable
          *            if not null and of length > 0, this will hold 'true' at index 0 if locale is directly defined
          *            (without fallback) as having plural rules
          * @return the functionally-equivalent locale
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
         @Deprecated
         public abstract ULocale getFunctionalEquivalent(ULocale locale, boolean[] isAvailable);
@@ -260,7 +251,7 @@
 
         /**
          * Returns the default factory.
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -270,7 +261,7 @@
 
         /**
          * Returns whether or not there are overrides.
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
         @Deprecated
         public abstract boolean hasOverride(ULocale locale);
@@ -363,7 +354,7 @@
     };
 
     /**
-     * 
+     *
      */
     private static final Rule DEFAULT_RULE = new Rule("other", NO_CONSTRAINT, null, null);
 
@@ -415,64 +406,73 @@
     }
 
     /**
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
     public static class FixedDecimal extends Number implements Comparable<FixedDecimal> {
         private static final long serialVersionUID = -4756200506571685661L;
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final double source;
+
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final int visibleDecimalDigitCount;
+
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final int visibleDecimalDigitCountWithoutTrailingZeros;
+
         /**
-         * icu_annot::internal
+         * Whether the number has no nonzero fraction digits.
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final long decimalDigits;
+
         /**
          * icu_annot::internal
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final long decimalDigitsWithoutTrailingZeros;
+
         /**
          * icu_annot::internal
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final long integerValue;
+
         /**
          * icu_annot::internal
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final boolean hasIntegerValue;
+
         /**
          * icu_annot::internal
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final boolean isNegative;
+
         private final int baseFactor;
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -481,7 +481,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -490,7 +490,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -499,7 +499,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -508,7 +508,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -517,7 +517,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -526,7 +526,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -535,7 +535,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -544,7 +544,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -555,7 +555,7 @@
         static final long MAX = (long)1E18;
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          * @param n is the original number
          * @param v number of digits to the right of the decimal place. e.g. 1.00 = 2 25. = 0
@@ -568,12 +568,10 @@
             source = isNegative ? -n : n;
             visibleDecimalDigitCount = v;
             decimalDigits = f;
-            integerValue = n > MAX 
-                    ? MAX 
-                            : (long)n;
+            integerValue = n > MAX ? MAX : (long) n;
             hasIntegerValue = source == integerValue;
             // check values. TODO make into unit test.
-            //            
+            //
             //            long visiblePower = (int) Math.pow(10, v);
             //            if (fractionalDigits > visiblePower) {
             //                throw new IllegalArgumentException();
@@ -602,7 +600,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -624,7 +622,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -633,7 +631,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -646,9 +644,9 @@
          * Return a guess as to the number of decimals that would be displayed. This is only a guess; callers should
          * always supply the decimals explicitly if possible. Currently, it is up to 6 decimals (without trailing zeros).
          * Returns 0 for infinities and nans.
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
-         * 
+         *
          */
         // @Deprecated: in fact internal ICU
         public static int decimals(double n) {
@@ -684,14 +682,14 @@
                     if (buf.charAt(i) != '0') {
                         break;
                     }
-                    --numFractionDigits; 
+                    --numFractionDigits;
                 }
                 return numFractionDigits;
             }
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -711,7 +709,9 @@
         }
 
         /**
-         * icu_annot::internal
+         * {@inheritDoc}
+         *
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -727,7 +727,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -738,7 +738,7 @@
 
         /**
          * We're not going to care about NaN.
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -761,7 +761,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -781,7 +781,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -792,7 +792,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -802,7 +802,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -811,18 +811,18 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         @Override
         public int intValue() {
             // TODO Auto-generated method stub
-            return (int)integerValue;
+            return (int) integerValue;
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -832,7 +832,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -842,7 +842,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -852,7 +852,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -874,19 +874,19 @@
 
     /**
      * Selection parameter for either integer-only or decimal-only.
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
     public enum SampleType {
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         INTEGER,
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -895,25 +895,25 @@
 
     /**
      * A range of NumberInfo that includes all values with the same visibleFractionDigitCount.
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
     public static class FixedDecimalRange {
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final FixedDecimal start;
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final FixedDecimal end;
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -925,7 +925,7 @@
             this.end = end;
         }
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -937,25 +937,25 @@
 
     /**
      * A list of NumberInfo that includes all values with the same visibleFractionDigitCount.
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
     public static class FixedDecimalSamples {
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final SampleType sampleType;
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
         public final Set<FixedDecimalRange> samples;
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -978,7 +978,7 @@
             SampleType sampleType2;
             boolean bounded2 = true;
             boolean haveBound = false;
-            Set<FixedDecimalRange> samples2 = new LinkedHashSet<FixedDecimalRange>();
+            Set<FixedDecimalRange> samples2 = new LinkedHashSet<>();
 
             if (source.startsWith("integer")) {
                 sampleType2 = SampleType.INTEGER;
@@ -989,7 +989,7 @@
             }
             source = source.substring(7).trim(); // remove both
 
-            for (String range : COMMA_SEPARATED.split(source)) {
+            for (String range : COMMA_SEPARATED.split(source, 0)) {
                 if (range.equals("…") || range.equals("...")) {
                     bounded2 = false;
                     haveBound = true;
@@ -998,9 +998,9 @@
                 if (haveBound) {
                     throw new IllegalArgumentException("Can only have … at the end of samples: " + range);
                 }
-                String[] rangeParts = TILDE_SEPARATED.split(range);
+                String[] rangeParts = TILDE_SEPARATED.split(range, 0);
                 switch (rangeParts.length) {
-                case 1: 
+                case 1:
                     FixedDecimal sample = new FixedDecimal(rangeParts[0]);
                     checkDecimal(sampleType2, sample);
                     samples2.add(new FixedDecimalRange(sample, sample));
@@ -1020,12 +1020,12 @@
 
         private static void checkDecimal(SampleType sampleType2, FixedDecimal sample) {
             if ((sampleType2 == SampleType.INTEGER) != (sample.getVisibleDecimalDigitCount() == 0)) {
-                throw new IllegalArgumentException("Ill-formed number range: " + sample);    
+                throw new IllegalArgumentException("Ill-formed number range: " + sample);
             }
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -1043,7 +1043,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -1066,7 +1066,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -1075,7 +1075,7 @@
         }
 
         /**
-         * icu_annot::internal
+         * icu_annot::internal CLDR
          * This API is ICU internal only.
          */
         // @Deprecated: in fact internal ICU
@@ -1115,7 +1115,7 @@
         // static final UnicodeSet BREAK_AND_KEEP = new UnicodeSet('!', '!', '%', '%', ',', ',', '.', '.', '=', '=').freeze();
         static String[] split(String source) {
             int last = -1;
-            List<String> result = new ArrayList<String>();
+            List<String> result = new ArrayList<>();
             for (int i = 0; i < source.length(); ++i) {
                 char ch = source.charAt(i);
                 if (isBreakAndIgnore(ch) /* BREAK_AND_IGNORE.contains(ch) */) {
@@ -1169,10 +1169,10 @@
             throws ParseException {
 
         Constraint result = null;
-        String[] or_together = OR_SEPARATED.split(description);
+        String[] or_together = OR_SEPARATED.split(description, 0);
         for (int i = 0; i < or_together.length; ++i) {
             Constraint andConstraint = null;
-            String[] and_together = AND_SEPARATED.split(or_together[i]);
+            String[] and_together = AND_SEPARATED.split(or_together[i], 0);
             for (int j = 0; j < and_together.length; ++j) {
                 Constraint newConstraint = NO_CONSTRAINT;
 
@@ -1234,7 +1234,7 @@
                         t = nextToken(tokens, x++, condition);
                     }
 
-                    List<Long> valueList = new ArrayList<Long>();
+                    List<Long> valueList = new ArrayList<>();
 
                     // the token t is always one item ahead
                     while (true) {
@@ -1254,7 +1254,7 @@
                                     if (!t.equals(",")) { // adjacent number: 1 2
                                         // no separator, fail
                                         throw unexpected(t, condition);
-                                    }                                
+                                    }
                                 }
                             } else if (!t.equals(",")) { // adjacent number: 1 2
                                 // no separator, fail
@@ -1367,12 +1367,12 @@
         }
 
         description = description.substring(x+1).trim();
-        String[] constraintOrSamples = AT_SEPARATED.split(description);
+        String[] constraintOrSamples = AT_SEPARATED.split(description, 0);
         boolean sampleFailure = false;
         FixedDecimalSamples integerSamples = null, decimalSamples = null;
         switch (constraintOrSamples.length) {
         case 1: break;
-        case 2: 
+        case 2:
             integerSamples = FixedDecimalSamples.parse(constraintOrSamples[1]);
             if (integerSamples.sampleType == SampleType.DECIMAL) {
                 decimalSamples = integerSamples;
@@ -1386,7 +1386,7 @@
                 throw new IllegalArgumentException("Must have @integer then @decimal in " + description);
             }
             break;
-        default: 
+        default:
             throw new IllegalArgumentException("Too many samples in " + description);
         }
         if (sampleFailure) {
@@ -1418,10 +1418,10 @@
             throws ParseException {
         RuleList result = new RuleList();
         // remove trailing ;
-        if (description.endsWith(";")) { 
+        if (description.endsWith(";")) {
             description = description.substring(0,description.length()-1);
         }
-        String[] rules = SEMI_SEPARATED.split(description);
+        String[] rules = SEMI_SEPARATED.split(description, 0);
         for (int i = 0; i < rules.length; ++i) {
             Rule rule = parseRule(rules[i].trim());
             result.hasExplicitBoundingInfo |= rule.integerSamples != null || rule.decimalSamples != null;
@@ -1480,11 +1480,11 @@
         @Override
         public boolean isLimited(SampleType sampleType) {
             boolean valueIsZero = lowerBound == upperBound && lowerBound == 0d;
-            boolean hasDecimals = 
+            boolean hasDecimals =
                     (operand == Operand.v || operand == Operand.w || operand == Operand.f || operand == Operand.t)
                     && inRange != valueIsZero; // either NOT f = zero or f = non-zero
             switch (sampleType) {
-            case INTEGER: 
+            case INTEGER:
                 return hasDecimals // will be empty
                         || ((operand == Operand.n || operand == Operand.i || operand == Operand.j)
                         && mod == 0
@@ -1493,7 +1493,7 @@
             case DECIMAL:
                 return  (!hasDecimals || operand == Operand.n || operand == Operand.j)
                         && (integersOnly || lowerBound == upperBound)
-                        && mod == 0 
+                        && mod == 0
                         && inRange;
             }
             return false;
@@ -1510,7 +1510,7 @@
             result.append(
                     !isList ? (inRange ? " = " : " != ")
                             : integersOnly ? (inRange ? " = " : " != ")
-                                    : (inRange ? " within " : " not within ") 
+                                    : (inRange ? " within " : " not within ")
                     );
             if (range_list != null) {
                 for (int i = 0; i < range_list.length; i += 2) {
@@ -1570,7 +1570,7 @@
         public boolean isLimited(SampleType sampleType) {
             // we ignore the case where both a and b are unlimited but no values
             // satisfy both-- we still consider this 'unlimited'
-            return a.isLimited(sampleType) 
+            return a.isLimited(sampleType)
                     || b.isLimited(sampleType);
         }
 
@@ -1590,7 +1590,7 @@
 
         @Override
         public boolean isFulfilled(FixedDecimal n) {
-            return a.isFulfilled(n) 
+            return a.isFulfilled(n)
                     || b.isFulfilled(n);
         }
 
@@ -1648,16 +1648,15 @@
 
         @Override
         public String toString() {
-            return keyword + ": " + constraint.toString() 
+            return keyword + ": " + constraint.toString()
                     + (integerSamples == null ? "" : " " + integerSamples.toString())
                     + (decimalSamples == null ? "" : " " + decimalSamples.toString());
         }
 
         /**
-         * icu_annot::internal
-         * This API is ICU internal only.
+         * {@inheritDoc}
+         * icu_annot::stable ICU 3.8
          */
-        // @Deprecated: in fact internal ICU
         @Override
         public int hashCode() {
             return keyword.hashCode() ^ constraint.hashCode();
@@ -1671,7 +1670,7 @@
     private static class RuleList implements Serializable {
         private boolean hasExplicitBoundingInfo = false;
         private static final long serialVersionUID = 1;
-        private final List<Rule> rules = new ArrayList<Rule>();
+        private final List<Rule> rules = new ArrayList<>();
 
         public RuleList addRule(Rule nextRule) {
             String keyword = nextRule.getKeyword();
@@ -1719,7 +1718,7 @@
         }
 
         public Set<String> getKeywords() {
-            Set<String> result = new LinkedHashSet<String>();
+            Set<String> result = new LinkedHashSet<>();
             for (Rule rule : rules) {
                 result.add(rule.getKeyword());
             }
@@ -1866,12 +1865,12 @@
 
     /**
      * Provides access to the predefined cardinal-number <code>PluralRules</code> for a given
-     * locale.
+     * {@link java.util.Locale}.
      * Same as forLocale(locale, PluralType.CARDINAL).
      *
      * <p>ICU defines plural rules for many locales based on CLDR <i>Language Plural Rules</i>.
      * For these predefined rules, see CLDR page at
-     * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+     * https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html
      *
      * @param locale The locale for which a <code>PluralRules</code> object is
      *   returned.
@@ -1880,7 +1879,7 @@
      *   for the closest parent in the locale hierarchy that has one will
      *   be returned.  The final fallback always returns the default
      *   rules.
-     * icu_annot::stable ICU 3.8
+     * icu_annot::stable ICU 54
      */
     public static PluralRules forLocale(Locale locale) {
         return forLocale(locale, PluralType.CARDINAL);
@@ -1892,7 +1891,7 @@
      *
      * <p>ICU defines plural rules for many locales based on CLDR <i>Language Plural Rules</i>.
      * For these predefined rules, see CLDR page at
-     * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+     * https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/language_plural_rules.html
      *
      * @param locale The locale for which a <code>PluralRules</code> object is
      *   returned.
@@ -1934,17 +1933,17 @@
     }
 
     /**
-     * icu_annot::internal
-     * This API is ICU internal only.
+     * {@inheritDoc}
+     * icu_annot::stable ICU 3.8
      */
-    // @Deprecated: in fact internal ICU
     @Override
     public int hashCode() {
         return rules.hashCode();
     }
+
     /**
-     * Given a number, returns the keyword of the first rule that applies to
-     * the number.
+     * Given a floating-point number, returns the keyword of the first rule
+     * that applies to the number.
      *
      * @param number The number for which the rule has to be determined.
      * @return The keyword of the selected rule.
@@ -1960,7 +1959,7 @@
      *
      * @param number The number for which the rule has to be determined.
      * @return The keyword of the selected rule.
-     * icu_annot::internal
+     * icu_annot::internal Visible For Testing
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
@@ -1972,23 +1971,22 @@
      * Given a number information, returns the keyword of the first rule that applies to
      * the number.
      *
-     * @param sample The number information for which the rule has to be determined.
+     * @param number The number information for which the rule has to be determined.
      * @return The keyword of the selected rule.
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
-    public String select(FixedDecimal sample) {
-        return rules.select(sample);
+    public String select(FixedDecimal number) {
+        return rules.select(number);
     }
 
-
     /**
      * Given a number information, and keyword, return whether the keyword would match the number.
      *
      * @param sample The number information for which the rule has to be determined.
      * @param keyword The keyword to filter on
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
@@ -2044,8 +2042,8 @@
      * @param type the type of samples requested, INTEGER or DECIMAL
      * @return the values that trigger this keyword, or null.  The returned collection
      * is immutable. It will be empty if the keyword is not defined.
-     * 
-     * icu_annot::internal
+     *
+     * icu_annot::internal Visible For Testing
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
@@ -2082,7 +2080,7 @@
      * @param keyword the keyword to test
      * @param sampleType the type of samples requested, INTEGER or DECIMAL
      * @return a list of values matching the keyword.
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * @deprecated ICU internal only
      */
     // @Deprecated: in fact internal ICU
@@ -2090,7 +2088,7 @@
         if (!keywords.contains(keyword)) {
             return null;
         }
-        Set<Double> result = new TreeSet<Double>();
+        Set<Double> result = new TreeSet<>();
 
         if (rules.hasExplicitBoundingInfo) {
             FixedDecimalSamples samples = rules.getDecimalSamples(keyword, sampleType);
@@ -2122,12 +2120,7 @@
         return result.size() == 0 ? null : Collections.unmodifiableSet(result);
     }
 
-    /**
-     * icu_annot::internal
-     * This API is ICU internal only.
-     */
-    // @Deprecated: in fact internal ICU
-    public boolean addSample(String keyword, Number sample, int maxCount, Set<Double> result) {
+    private boolean addSample(String keyword, Number sample, int maxCount, Set<Double> result) {
         String selectedKeyword = sample instanceof FixedDecimal ? select((FixedDecimal)sample) : select(sample.doubleValue());
         if (selectedKeyword.equals(keyword)) {
             result.add(sample.doubleValue());
@@ -2148,7 +2141,7 @@
      * @param keyword the keyword to test
      * @param sampleType the type of samples requested, INTEGER or DECIMAL
      * @return a list of values matching the keyword.
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
@@ -2159,8 +2152,7 @@
     /**
      * Returns the set of locales for which PluralRules are known.
      * @return the set of locales for which PluralRules are known, as a list
-     * icu_annot::draft ICU 4.2
-     * icu_annot::provisional This API might change or be removed in a future release.
+     * icu_annot::draft ICU 4.2 (retain)
     public static ULocale[] getAvailableULocales() {
         return Factory.getDefaultFactory().getAvailableULocales();
     }
@@ -2180,8 +2172,7 @@
      * @param isAvailable if not null and of length > 0, this will hold 'true' at
      * index 0 if locale is directly defined (without fallback) as having plural rules
      * @return the functionally-equivalent locale
-     * icu_annot::draft ICU 4.2
-     * icu_annot::provisional This API might change or be removed in a future release.
+     * icu_annot::draft ICU 4.2 (retain)
     public static ULocale getFunctionalEquivalent(ULocale locale, boolean[] isAvailable) {
         return Factory.getDefaultFactory().getFunctionalEquivalent(locale, isAvailable);
     }
@@ -2219,51 +2210,45 @@
 
     /**
      * Status of the keyword for the rules, given a set of explicit values.
-     * 
+     *
      * icu_annot::draft ICU 50
-     * icu_annot::provisional This API might change or be removed in a future release.
      */
     public enum KeywordStatus {
         /**
          * The keyword is not valid for the rules.
-         * 
+         *
          * icu_annot::draft ICU 50
-         * icu_annot::provisional This API might change or be removed in a future release.
          */
         INVALID,
         /**
          * The keyword is valid, but unused (it is covered by the explicit values, OR has no values for the given {@link SampleType}).
-         * 
+         *
          * icu_annot::draft ICU 50
-         * icu_annot::provisional This API might change or be removed in a future release.
          */
         SUPPRESSED,
         /**
          * The keyword is valid, used, and has a single possible value (before considering explicit values).
-         * 
+         *
          * icu_annot::draft ICU 50
-         * icu_annot::provisional This API might change or be removed in a future release.
          */
         UNIQUE,
         /**
          * The keyword is valid, used, not unique, and has a finite set of values.
-         * 
+         *
          * icu_annot::draft ICU 50
-         * icu_annot::provisional This API might change or be removed in a future release.
          */
         BOUNDED,
         /**
          * The keyword is valid but not bounded; there indefinitely many matching values.
-         * 
+         *
          * icu_annot::draft ICU 50
-         * icu_annot::provisional This API might change or be removed in a future release.
          */
         UNBOUNDED
     }
 
     /**
      * Find the status for the keyword, given a certain set of explicit values.
-     * 
+     *
      * @param keyword
      *            the particular keyword (call rules.getKeywords() to get the valid ones)
      * @param offset
@@ -2275,7 +2260,6 @@
      *            If non null, set to the unique value.
      * @return the KeywordStatus
      * icu_annot::draft ICU 50
-     * icu_annot::provisional This API might change or be removed in a future release.
      */
     public KeywordStatus getKeywordStatus(String keyword, int offset, Set<Double> explicits,
             Output<Double> uniqueValue) {
@@ -2283,7 +2267,7 @@
     }
     /**
      * Find the status for the keyword, given a certain set of explicit values.
-     * 
+     *
      * @param keyword
      *            the particular keyword (call rules.getKeywords() to get the valid ones)
      * @param offset
@@ -2296,9 +2280,10 @@
      * @param uniqueValue
      *            If non null, set to the unique value.
      * @return the KeywordStatus
-     * icu_annot::internal
-     * icu_annot::provisional This API might change or be removed in a future release.
+     * icu_annot::internal Visible For Testing
+     * This API is ICU internal only.
      */
+    // @Deprecated: in fact internal ICU
     public KeywordStatus getKeywordStatus(String keyword, int offset, Set<Double> explicits,
             Output<Double> uniqueValue, SampleType sampleType) {
         if (uniqueValue != null) {
@@ -2335,7 +2320,7 @@
 
         // Compute if the quick test is insufficient.
 
-        HashSet<Double> subtractedSet = new HashSet<Double>(values);
+        HashSet<Double> subtractedSet = new HashSet<>(values);
         for (Double explicit : explicits) {
             subtractedSet.remove(explicit - offset);
         }
@@ -2351,7 +2336,7 @@
     }
 
     /**
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * This API is ICU internal only.
      */
     // @Deprecated: in fact internal ICU
@@ -2375,7 +2360,7 @@
     }
     */
     /**
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * @deprecated internal
      */
     // @Deprecated: in fact internal ICU
@@ -2383,17 +2368,12 @@
         return toString().compareTo(other.toString());
     }
 
-    /**
-     * icu_annot::internal
-     * @deprecated internal
-     */
-    // @Deprecated: in fact internal ICU
-    public Boolean isLimited(String keyword) {
+    Boolean isLimited(String keyword) {
         return rules.isLimited(keyword, SampleType.INTEGER);
     }
 
     /**
-     * icu_annot::internal
+     * icu_annot::internal Visible For Testing
      * @deprecated internal
      */
     // @Deprecated: in fact internal ICU
@@ -2402,7 +2382,7 @@
     }
 
     /**
-     * icu_annot::internal
+     * icu_annot::internal CLDR
      * @deprecated internal
      */
     // @Deprecated: in fact internal ICU
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index c5bbfb0..c7ef3b1 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="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/uwb/uwb/src/main/java/androidx/core/uwb/UwbDevice.kt b/core/uwb/uwb/src/main/java/androidx/core/uwb/UwbDevice.kt
index da8a982..405e9a8 100644
--- a/core/uwb/uwb/src/main/java/androidx/core/uwb/UwbDevice.kt
+++ b/core/uwb/uwb/src/main/java/androidx/core/uwb/UwbDevice.kt
@@ -27,7 +27,7 @@
         /**
          * Creates a new UwbDevice for a given address.
          *
-         * @throws an [IllegalArgumentException] if address is invalid.
+         * @throws [IllegalArgumentException] if address is invalid.
          */
         @JvmStatic
         fun createForAddress(address: String): UwbDevice {
diff --git a/datastore/datastore-preferences-core/src/commonMain/kotlin/androidx/datastore/preferences/core/Preferences.kt b/datastore/datastore-preferences-core/src/commonMain/kotlin/androidx/datastore/preferences/core/Preferences.kt
index 4ebd196..bb40dc3 100644
--- a/datastore/datastore-preferences-core/src/commonMain/kotlin/androidx/datastore/preferences/core/Preferences.kt
+++ b/datastore/datastore-preferences-core/src/commonMain/kotlin/androidx/datastore/preferences/core/Preferences.kt
@@ -344,7 +344,8 @@
  * @param transform block which accepts MutablePreferences that contains all the preferences
  * currently in DataStore. Changes to this MutablePreferences object will be persisted once
  * transform completes.
- * @throws IOException when an exception is encountered when writing data to disk
+ * @throws androidx.datastore.core.IOException when an exception is encountered when writing
+ * data to disk
  * @throws Exception when thrown by the transform block
  */
 
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index fa2c57b..078df07 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -272,6 +272,14 @@
 @param copySelectedOptions
 in DClass Builder
 Did you make a typo\? Are you trying to refer to something not visible to users\?
+WARNING: do not use 'an' before the exception type in an @throws statement\. This is against jdoc spec, will be an error in the next version of dackka, and your exception is not being linked and looks bad\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[DocumentationLink\(dri=java\.lang/IllegalArgumentException///PointingToDeclaration/, children=\[Text\(body=IllegalArgumentException, children=\[\], params=\{\}\)\], params=\{\}\), Text\(body= if the property name or index is invalid\., children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=an, exceptionAddress=null\)\.
+WARNING: do not use 'an' before the exception type in an @throws statement\. This is against jdoc spec, will be an error in the next version of dackka, and your exception is not being linked and looks bad\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[DocumentationLink\(dri=kotlin/IllegalArgumentException///PointingToDeclaration/, children=\[Text\(body=IllegalArgumentException, children=\[\], params=\{\}\)\], params=\{href=\[IllegalArgumentException\]\}\), Text\(body= if address is invalid\., children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=an, exceptionAddress=null\)\.
+WARNING: link to @throws type RemoteException does not resolve\. Is it from a package that the containing file does not import\? Is docs inherited to an un\-documented override function, but the exception class is not in scope in the inheriting class\? The general fix for these is to fully qualify the exception name,  e\.g\.`@throws java\.io\.IOException under some conditions\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[Text\(body=For any IPC transportation failures\., children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=RemoteException, exceptionAddress=null\)\.`
+WARNING: link to @throws type IOException does not resolve\. Is it from a package that the containing file does not import\? Is docs inherited to an un\-documented override function, but the exception class is not in scope in the inheriting class\? The general fix for these is to fully qualify the exception name,  e\.g\.`@throws java\.io\.IOException under some conditions\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[Text\(body=For any disk I/O issues\., children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=IOException, exceptionAddress=null\)\.`
+WARNING: link to @throws type IOException does not resolve\. Is it from a package that the containing file does not import\? Is docs inherited to an un\-documented override function, but the exception class is not in scope in the inheriting class\? The general fix for these is to fully qualify the exception name,  e\.g\.`@throws java\.io\.IOException under some conditions\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[Text\(body=when an exception is encountered when writing data to disk, children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=IOException, exceptionAddress=null\)\.`
+WARNING: link to @throws type ComposeTimeoutException does not resolve\. Is it from a package that the containing file does not import\? Is docs inherited to an un\-documented override function, but the exception class is not in scope in the inheriting class\? The general fix for these is to fully qualify the exception name,  e\.g\.`@throws java\.io\.IOException under some conditions\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[Text\(body=If the condition is not satisfied after , children=\[\], params=\{\}\), DocumentationLink\(dri=androidx\.compose\.ui\.test\.junit[0-9]+/AndroidComposeTestRule/waitUntil/\#kotlin\.Long\#kotlin\.Function[0-9]+\[kotlin\.Boolean\]/PointingToCallableParameters\([0-9]+\)/, children=\[Text\(body=timeoutMillis, children=\[\], params=\{\}\)\], params=\{href=\[timeoutMillis\]\}\), Text\(body=\., children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=ComposeTimeoutException, exceptionAddress=null\)\.`
+WARNING: link to @throws type Renderer\.GlesException does not resolve\. Is it from a package that the containing file does not import\? Is docs inherited to an un\-documented override function, but the exception class is not in scope in the inheriting class\? The general fix for these is to fully qualify the exception name,  e\.g\.`@throws java\.io\.IOException under some conditions\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[Text\(body=If any GL calls fail during initialization\., children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=Renderer\.GlesException, exceptionAddress=null\)\.`
+WARNING: link to @throws type ServiceStartFailureException does not resolve\. Is it from a package that the containing file does not import\? Is docs inherited to an un\-documented override function, but the exception class is not in scope in the inheriting class\? The general fix for these is to fully qualify the exception name,  e\.g\.`@throws java\.io\.IOException under some conditions\. This was observed in Throws\(root=CustomDocTag\(children=\[P\(children=\[Text\(body=if the watchface dies during startup\., children=\[\], params=\{\}\)\], params=\{\}\)\], params=\{\}, name=MARKDOWN_FILE\), name=ServiceStartFailureException, exceptionAddress=null\)\.`
 # Wire proto generation, task :generateDebugProtos
 Writing .* to \$OUT_DIR/.*/build/generated/source/wire
 # > Task :compose:ui:ui-tooling:processDebugAndroidTestManifest
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index ffc1efc..582f65c 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -235,6 +235,9 @@
     docs(project(":preference:preference"))
     docs(project(":preference:preference-ktx"))
     docs(project(":print:print"))
+    docs(project(":privacysandbox:tools:tools"))
+    docs(project(":privacysandbox:tools:tools-apicompiler"))
+    docs(project(":privacysandbox:tools:tools-apigenerator"))
     docs(project(":profileinstaller:profileinstaller"))
     docs(project(":recommendation:recommendation"))
     docs(project(":recyclerview:recyclerview"))
diff --git a/fakeannotations/build.gradle b/fakeannotations/build.gradle
index a8ac931..d4bdd9d 100644
--- a/fakeannotations/build.gradle
+++ b/fakeannotations/build.gradle
@@ -20,5 +20,5 @@
     implementation(fileTree(dir: "libs", include: ["*.jar"]))
 }
 
-sourceCompatibility = "7"
-targetCompatibility = "7"
+sourceCompatibility = "8"
+targetCompatibility = "8"
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 4b46199..81befd7 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -71,7 +71,7 @@
 checkerframework = { module = "org.checkerframework:checker-qual", version = "2.5.3" }
 checkmark = { module = "net.saff.checkmark:checkmark", version = "0.1.2" }
 constraintLayout = { module = "androidx.constraintlayout:constraintlayout", version = "2.0.1"}
-dackka = { module = "com.google.devsite:dackka", version = "0.0.18" }
+dackka = { module = "com.google.devsite:dackka", version = "0.0.19" }
 dagger = { module = "com.google.dagger:dagger", version.ref = "dagger" }
 daggerCompiler = { module = "com.google.dagger:dagger-compiler", version.ref = "dagger" }
 dexmakerMockito = { module = "com.linkedin.dexmaker:dexmaker-mockito", version.ref = "dexmaker" }
diff --git a/graphics/graphics-core/build.gradle b/graphics/graphics-core/build.gradle
index ecccb42..630e316 100644
--- a/graphics/graphics-core/build.gradle
+++ b/graphics/graphics-core/build.gradle
@@ -45,7 +45,6 @@
             }
         }
     }
-    ndkVersion "23.1.7779620"
     externalNativeBuild {
         cmake {
             path file('src/main/cpp/CMakeLists.txt')
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
index 27151164..ff42184 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/GLFrontBufferedRendererTest.kt
@@ -24,8 +24,8 @@
 import android.view.SurfaceView
 import androidx.annotation.RequiresApi
 import androidx.graphics.opengl.egl.EGLManager
-import androidx.graphics.surface.SurfaceControlCompat
 import androidx.graphics.opengl.egl.deviceSupportsNativeAndroidFence
+import androidx.graphics.surface.SurfaceControlCompat
 import androidx.graphics.surface.SurfaceControlUtils
 import androidx.lifecycle.Lifecycle
 import androidx.test.core.app.ActivityScenario
@@ -209,8 +209,30 @@
             }
 
             SurfaceControlUtils.validateOutput { bitmap ->
-                Color.BLUE ==
-                    bitmap.getPixel(coords[0] + width / 2, coords[1] + height / 2)
+                (Math.abs(
+                    Color.red(Color.BLUE) - Color.red(
+                        bitmap.getPixel(
+                            coords[0] + width / 2,
+                            coords[1] + height / 2
+                        )
+                    )
+                ) < 2) &&
+                    (Math.abs(
+                        Color.green(Color.BLUE) - Color.green(
+                            bitmap.getPixel(
+                                coords[0] + width / 2,
+                                coords[1] + height / 2
+                            )
+                        )
+                    ) < 2) &&
+                    (Math.abs(
+                        Color.blue(Color.BLUE) - Color.blue(
+                            bitmap.getPixel(
+                                coords[0] + width / 2,
+                                coords[1] + height / 2
+                            )
+                        )
+                    ) < 2)
             }
         } finally {
             renderer.blockingRelease()
@@ -233,8 +255,10 @@
     fun testUsageFlagContainsComposerOverlay() {
         val usageFlags = GLFrontBufferedRenderer.obtainHardwareBufferUsageFlags()
         if (UsageFlagsVerificationHelper.isSupported(HardwareBuffer.USAGE_COMPOSER_OVERLAY)) {
-            assertNotEquals(0,
-                usageFlags and HardwareBuffer.USAGE_COMPOSER_OVERLAY)
+            assertNotEquals(
+                0,
+                usageFlags and HardwareBuffer.USAGE_COMPOSER_OVERLAY
+            )
         } else {
             assertEquals(0, usageFlags and HardwareBuffer.USAGE_COMPOSER_OVERLAY)
         }
@@ -243,10 +267,14 @@
     @Test
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
     fun testBaseFlags() {
-        assertNotEquals(0, GLFrontBufferedRenderer.BaseFlags and
-            HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE)
-        assertNotEquals(0, GLFrontBufferedRenderer.BaseFlags and
-            HardwareBuffer.USAGE_GPU_COLOR_OUTPUT)
+        assertNotEquals(
+            0, GLFrontBufferedRenderer.BaseFlags and
+                HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE
+        )
+        assertNotEquals(
+            0, GLFrontBufferedRenderer.BaseFlags and
+                HardwareBuffer.USAGE_GPU_COLOR_OUTPUT
+        )
     }
 
     @RequiresApi(Build.VERSION_CODES.Q)
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt
index 8ccd453..dbcb0ac 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlCompat.kt
@@ -172,7 +172,7 @@
         }
 
         /**
-         * Toggle the visibility of a given Layer and it's sub-tree.
+         * Sets the visibility of a given Layer and it's sub-tree.
          * @param surfaceControl Target [SurfaceControlCompat] to change the visibility
          * @param visible `true` to indicate the [SurfaceControlCompat] should be visible, `false`
          * otherwise
@@ -279,7 +279,8 @@
 
         /**
          * Request to add a [SurfaceControlCompat.TransactionCommittedListener]. The callback is
-         * invoked when transaction is applied and the updates are ready to be presented.
+         * invoked when transaction is applied and the updates are ready to be presented. Once
+         * applied, any callbacks added before the commit will be cleared from the Transaction.
          * This callback does not mean buffers have been released! It simply means that any new
          * transactions applied will not overwrite the transaction for which we are receiving a
          * callback and instead will be included in the next frame.
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt
index be1fee5..e8258b6 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/surface/SurfaceControlImpl.kt
@@ -106,7 +106,7 @@
         fun setOpaque(surfaceControl: SurfaceControlImpl, isOpaque: Boolean): Transaction
 
         /**
-         * Toggle the visibility of a given Layer and it's sub-tree.
+         * Sets the visibility of a given Layer and it's sub-tree.
          * @param surfaceControl Target [SurfaceControlImpl]
          */
         fun setVisibility(surfaceControl: SurfaceControlImpl, visible: Boolean): Transaction
@@ -192,7 +192,8 @@
 
         /**
          * Request to add a [SurfaceControlCompat.TransactionCommittedListener]. The callback is
-         * invoked when transaction is applied and the updates are ready to be presented.
+         * invoked when transaction is applied and the updates are ready to be presented. Once
+         * applied, any callbacks added before the commit will be cleared from the Transaction.
          * This callback does not mean buffers have been released! It simply means that any new
          * transactions applied will not overwrite the transaction for which we are receiving a
          * callback and instead will be included in the next frame.
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
index d81a5a3a..cb8f510 100644
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
+++ b/health/health-connect-client/src/main/java/androidx/health/connect/client/HealthConnectClient.kt
@@ -356,5 +356,12 @@
                 false
             }
         }
+
+        /**
+         * Tag used in SDK debug logs.
+         * @suppress
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        internal const val HEALTH_CONNECT_CLIENT_TAG = "HealthConnectClient"
     }
 }
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
index ccdef20..7232366 100644
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
+++ b/health/health-connect-client/src/main/java/androidx/health/connect/client/impl/HealthConnectClientImpl.kt
@@ -17,6 +17,7 @@
 
 import androidx.activity.result.contract.ActivityResultContract
 import androidx.health.connect.client.HealthConnectClient
+import androidx.health.connect.client.HealthConnectClient.Companion.HEALTH_CONNECT_CLIENT_TAG
 import androidx.health.connect.client.PermissionController
 import androidx.health.connect.client.aggregate.AggregationResult
 import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
@@ -50,6 +51,7 @@
 import androidx.health.connect.client.response.ReadRecordsResponse
 import androidx.health.connect.client.time.TimeRangeFilter
 import androidx.health.platform.client.HealthDataAsyncClient
+import androidx.health.platform.client.impl.logger.Logger
 import androidx.health.platform.client.proto.DataProto
 import androidx.health.platform.client.proto.RequestProto
 import kotlin.reflect.KClass
@@ -72,15 +74,22 @@
         createHealthDataRequestPermissions(providerPackageName = providerPackageName)
 
     override suspend fun getGrantedPermissions(permissions: Set<Permission>): Set<Permission> {
-        return delegate
-            .getGrantedPermissions(permissions.map { it.toProtoPermission() }.toSet())
-            .await()
-            .map { it.toJetpackPermission() }
-            .toSet()
+        val grantedPermissions =
+            delegate
+                .getGrantedPermissions(permissions.map { it.toProtoPermission() }.toSet())
+                .await()
+                .map { it.toJetpackPermission() }
+                .toSet()
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "Granted ${grantedPermissions.size} out of ${permissions.size} permissions."
+        )
+        return grantedPermissions
     }
 
     override suspend fun revokeAllPermissions() {
-        return delegate.revokeAllPermissions().await()
+        delegate.revokeAllPermissions().await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Revoked all permissions.")
     }
 
     override val permissionController: PermissionController
@@ -88,11 +97,13 @@
 
     override suspend fun insertRecords(records: List<Record>): InsertRecordsResponse {
         val uidList = delegate.insertData(records.map { it.toProto() }).await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "${records.size} records inserted.")
         return InsertRecordsResponse(recordUidsList = uidList)
     }
 
     override suspend fun updateRecords(records: List<Record>) {
         delegate.updateData(records.map { it.toProto() }).await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "${records.size} records updated.")
     }
 
     override suspend fun deleteRecords(
@@ -106,6 +117,10 @@
                 toDataTypeIdPairProtoList(recordType, clientIdsList)
             )
             .await()
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "${uidsList.size + clientIdsList.size} records deleted."
+        )
     }
 
     override suspend fun deleteRecords(
@@ -113,6 +128,7 @@
         timeRangeFilter: TimeRangeFilter,
     ) {
         delegate.deleteDataRange(toDeleteDataRangeRequestProto(recordType, timeRangeFilter)).await()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Records deletion successful.")
     }
 
     @Suppress("UNCHECKED_CAST") // Safe to cast as the type should match
@@ -121,7 +137,9 @@
         uid: String,
     ): ReadRecordResponse<T> {
         val proto = delegate.readData(toReadDataRequestProto(recordType, uid)).await()
-        return ReadRecordResponse(toRecord(proto) as T)
+        val response = ReadRecordResponse(toRecord(proto) as T)
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Reading record of $uid successful.")
+        return response
     }
 
     override suspend fun getChangesToken(request: ChangesTokenRequest): String {
@@ -144,7 +162,9 @@
                         .build()
                 )
                 .await()
-        return proto.changesToken
+        val changeToken = proto.changesToken
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieved change token $changeToken.")
+        return changeToken
     }
 
     override suspend fun getChanges(changesToken: String): ChangesResponse {
@@ -156,6 +176,11 @@
                         .build()
                 )
                 .await()
+        val nextToken = proto.nextChangesToken
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "Retrieved changes successful with $changesToken, next token $nextToken."
+        )
         return toChangesResponse(proto)
     }
 
@@ -163,25 +188,40 @@
         request: ReadRecordsRequest<T>,
     ): ReadRecordsResponse<T> {
         val proto = delegate.readDataRange(toReadDataRangeRequestProto(request)).await()
-        return toReadRecordsResponse(proto)
+        val response = toReadRecordsResponse<T>(proto)
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieve records successful.")
+        return response
     }
 
     override suspend fun aggregate(request: AggregateRequest): AggregationResult {
         val responseProto = delegate.aggregate(request.toProto()).await()
-        return responseProto.rowsList.first().retrieveAggregateDataRow()
+        val result = responseProto.rowsList.first().retrieveAggregateDataRow()
+        val numberOfMetrics = result.longValues.size + result.doubleValues.size
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Retrieved $numberOfMetrics metrics.")
+        return result
     }
 
     override suspend fun aggregateGroupByDuration(
         request: AggregateGroupByDurationRequest,
     ): List<AggregationResultGroupedByDuration> {
         val responseProto = delegate.aggregate(request.toProto()).await()
-        return responseProto.rowsList.map { it.toAggregateDataRowGroupByDuration() }.toList()
+        val result = responseProto.rowsList.map { it.toAggregateDataRowGroupByDuration() }.toList()
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "Retrieved ${result.size} duration aggregation buckets."
+        )
+        return result
     }
 
     override suspend fun aggregateGroupByPeriod(
         request: AggregateGroupByPeriodRequest
     ): List<AggregationResultGroupedByPeriod> {
         val responseProto = delegate.aggregate(request.toProto()).await()
-        return responseProto.rowsList.map { it.toAggregateDataRowGroupByPeriod() }.toList()
+        val result = responseProto.rowsList.map { it.toAggregateDataRowGroupByPeriod() }.toList()
+        Logger.debug(
+            HEALTH_CONNECT_CLIENT_TAG,
+            "Retrieved ${result.size} period aggregation buckets."
+        )
+        return result
     }
 }
diff --git a/health/health-connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt b/health/health-connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt
index c697b09..9290331 100644
--- a/health/health-connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt
+++ b/health/health-connect-client/src/main/java/androidx/health/connect/client/permission/HealthDataRequestPermissions.kt
@@ -19,9 +19,11 @@
 import android.content.Intent
 import androidx.activity.result.contract.ActivityResultContract
 import androidx.health.connect.client.HealthConnectClient.Companion.DEFAULT_PROVIDER_PACKAGE_NAME
+import androidx.health.connect.client.HealthConnectClient.Companion.HEALTH_CONNECT_CLIENT_TAG
 import androidx.health.connect.client.impl.converters.permission.toJetpackPermission
 import androidx.health.connect.client.impl.converters.permission.toProtoPermission
 import androidx.health.platform.client.permission.Permission as ProtoPermission
+import androidx.health.platform.client.impl.logger.Logger
 import androidx.health.platform.client.service.HealthDataServiceConstants.ACTION_REQUEST_PERMISSIONS
 import androidx.health.platform.client.service.HealthDataServiceConstants.KEY_GRANTED_PERMISSIONS_JETPACK
 import androidx.health.platform.client.service.HealthDataServiceConstants.KEY_REQUESTED_PERMISSIONS_JETPACK
@@ -50,6 +52,7 @@
                 .asSequence()
                 .map { ProtoPermission(it.toProtoPermission()) }
                 .toCollection(ArrayList())
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Requesting ${input.size} permissions.")
         return Intent(ACTION_REQUEST_PERMISSIONS).apply {
             putParcelableArrayListExtra(KEY_REQUESTED_PERMISSIONS_JETPACK, protoPermissionList)
             if (providerPackageName.isNotEmpty()) {
@@ -60,12 +63,15 @@
 
     @Suppress("DEPRECATION")
     override fun parseResult(resultCode: Int, intent: Intent?): Set<Permission> {
-        return intent
-            ?.getParcelableArrayListExtra<ProtoPermission>(KEY_GRANTED_PERMISSIONS_JETPACK)
-            ?.asSequence()
-            ?.map { it.proto.toJetpackPermission() }
-            ?.toSet()
-            ?: emptySet()
+        val grantedPermissions =
+            intent
+                ?.getParcelableArrayListExtra<ProtoPermission>(KEY_GRANTED_PERMISSIONS_JETPACK)
+                ?.asSequence()
+                ?.map { it.proto.toJetpackPermission() }
+                ?.toSet()
+                ?: emptySet()
+        Logger.debug(HEALTH_CONNECT_CLIENT_TAG, "Granted ${grantedPermissions.size} permissions.")
+        return grantedPermissions
     }
 
     override fun getSynchronousResult(
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java b/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java
index b4e43fd..52d1237 100644
--- a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java
+++ b/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/DefaultExecutionTracker.java
@@ -39,23 +39,25 @@
     public void track(SettableFuture<?> future) {
         synchronized (mFuturesInProgress) {
             mFuturesInProgress.add(future);
+            future.addListener(
+                    () -> {
+                        synchronized (mFuturesInProgress) {
+                            mFuturesInProgress.remove(future);
+                        }
+                    },
+                    MoreExecutors.directExecutor());
         }
-        future.addListener(
-                () -> {
-                    synchronized (mFuturesInProgress) {
-                        mFuturesInProgress.remove(future);
-                    }
-                },
-                MoreExecutors.directExecutor());
     }
 
     @Override
     public void cancelPendingFutures(Throwable throwable) {
+        Set<SettableFuture<?>> futuresInProgressCopy;
         synchronized (mFuturesInProgress) {
-            for (SettableFuture<?> future : mFuturesInProgress) {
-                future.setException(throwable);
-            }
+            futuresInProgressCopy = new HashSet<>(mFuturesInProgress);
             mFuturesInProgress.clear();
         }
+        for (SettableFuture<?> future : futuresInProgressCopy) {
+            future.setException(throwable);
+        }
     }
 }
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java b/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java
index 099e013..45a771a 100644
--- a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java
+++ b/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/ipc/internal/ServiceConnection.java
@@ -24,12 +24,12 @@
 import android.os.DeadObjectException;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.util.Log;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.annotation.VisibleForTesting;
+import androidx.health.platform.client.impl.logger.Logger;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -62,7 +62,7 @@
         /**
          * Called when the connection to the server was lost.
          *
-         * @param connection Represents this connection to a service.
+         * @param connection       Represents this connection to a service.
          * @param reconnectDelayMs Delay before the caller should try to reconnect this connection.
          */
         void onDisconnected(ServiceConnection connection, long reconnectDelayMs);
@@ -83,7 +83,9 @@
     private final Map<ListenerKey, QueueOperation> mRegisteredListeners = new HashMap<>();
     private final Callback mCallback;
 
-    @VisibleForTesting @Nullable IBinder mBinder;
+    @VisibleForTesting
+    @Nullable
+    IBinder mBinder;
     private volatile boolean mIsServiceBound;
     /** Denotes how many times connection to the service failed and we retried. */
     private int mServiceConnectionRetry;
@@ -121,7 +123,7 @@
                             this,
                             Context.BIND_AUTO_CREATE | Context.BIND_ADJUST_WITH_ACTIVITY);
         } catch (SecurityException exception) {
-            Log.w(
+            Logger.warning(
                     TAG,
                     "Failed to bind connection '"
                             + mConnectionConfiguration.getKey()
@@ -134,7 +136,7 @@
 
         if (!mIsServiceBound) {
             // Service not found or we don't have permission to call it.
-            Log.e(
+            Logger.error(
                     TAG,
                     "Connection to service is not available for package '"
                             + mConnectionConfiguration.getPackageName()
@@ -154,14 +156,14 @@
     private synchronized void handleRetriableDisconnection(Throwable throwable) {
         if (isConnected()) {
             // Connection is already re-established. So just return.
-            Log.w(TAG, "Connection is already re-established. No need to reconnect again");
+            Logger.warning(TAG, "Connection is already re-established. No need to reconnect again");
             return;
         }
 
         clearConnection(throwable);
 
         if (mServiceConnectionRetry < MAX_RETRIES) {
-            Log.w(
+            Logger.warning(
                     TAG,
                     "WCS SDK Client '"
                             + mConnectionConfiguration.getClientName()
@@ -170,7 +172,8 @@
                     throwable);
             mCallback.onDisconnected(this, getRetryDelayMs(mServiceConnectionRetry));
         } else {
-            Log.e(TAG, "Connection disconnected and maximum number of retries reached.", throwable);
+            Logger.error(TAG, "Connection disconnected and maximum number of retries reached.",
+                    throwable);
         }
     }
 
@@ -186,7 +189,7 @@
                 mContext.unbindService(this);
                 mIsServiceBound = false;
             } catch (IllegalArgumentException e) {
-                Log.e(TAG, "Failed to unbind the service. Ignoring and continuing", e);
+                Logger.error(TAG, "Failed to unbind the service. Ignoring and continuing", e);
             }
         }
 
@@ -220,14 +223,14 @@
 
     void maybeReconnect() {
         if (mRegisteredListeners.isEmpty()) {
-            Log.d(
+            Logger.debug(
                     TAG,
                     "No listeners registered, service "
                             + mConnectionConfiguration.getClientName()
                             + " is not automatically reconnected.");
         } else {
             mServiceConnectionRetry++;
-            Log.d(
+            Logger.debug(
                     TAG,
                     "Listeners for service "
                             + mConnectionConfiguration.getClientName()
@@ -251,7 +254,7 @@
 
     void reRegisterAllListeners() {
         for (Map.Entry<ListenerKey, QueueOperation> entry : mRegisteredListeners.entrySet()) {
-            Log.d(TAG, "Re-registering listener: " + entry.getKey());
+            Logger.debug(TAG, "Re-registering listener: " + entry.getKey());
             execute(entry.getValue());
         }
     }
@@ -285,9 +288,9 @@
 
     @Override
     public void onServiceConnected(ComponentName componentName, IBinder binder) {
-        Log.d(TAG, "onServiceConnected(), componentName = " + componentName);
+        Logger.debug(TAG, "onServiceConnected(), componentName = " + componentName);
         if (binder == null) {
-            Log.e(TAG, "Service connected but binder is null.");
+            Logger.error(TAG, "Service connected but binder is null.");
             return;
         }
         mServiceConnectionRetry = 0;
@@ -300,7 +303,7 @@
         try {
             binder.linkToDeath(
                     () -> {
-                        Log.w(
+                        Logger.warning(
                                 TAG,
                                 "Binder died for client:"
                                         + mConnectionConfiguration.getClientName());
@@ -308,7 +311,7 @@
                     },
                     /* flags= */ 0);
         } catch (RemoteException exception) {
-            Log.w(
+            Logger.warning(
                     TAG,
                     "Cannot link to death, binder already died. Cleaning operations.",
                     exception);
@@ -318,19 +321,20 @@
 
     @Override
     public void onServiceDisconnected(ComponentName componentName) {
-        Log.d(TAG, "onServiceDisconnected(), componentName = " + componentName);
+        Logger.debug(TAG, "onServiceDisconnected(), componentName = " + componentName);
         // Service disconnected but binding still exists so it should reconnect automatically.
     }
 
     @Override
     public void onBindingDied(ComponentName name) {
-        Log.e(TAG, "Binding died for client '" + mConnectionConfiguration.getClientName() + "'.");
+        Logger.error(TAG,
+                "Binding died for client '" + mConnectionConfiguration.getClientName() + "'.");
         handleRetriableDisconnection(new RemoteException("Binding died"));
     }
 
     @Override
     public void onNullBinding(ComponentName name) {
-        Log.e(
+        Logger.error(
                 TAG,
                 "Cannot bind client '"
                         + mConnectionConfiguration.getClientName()
diff --git a/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/logger/Logger.kt b/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/logger/Logger.kt
new file mode 100644
index 0000000..6926fd0
--- /dev/null
+++ b/health/health-connect-client/src/main/java/androidx/health/platform/client/impl/logger/Logger.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.impl.logger
+
+import android.util.Log
+
+internal object Logger {
+    @JvmStatic
+    fun debug(tag: String, message: String) {
+        if (Log.isLoggable(tag, Log.DEBUG)) {
+            Log.d(tag, message)
+        }
+    }
+
+    @JvmStatic
+    fun warning(tag: String, message: String) {
+        if (Log.isLoggable(tag, Log.WARN)) {
+            Log.w(tag, message)
+        }
+    }
+
+    @JvmStatic
+    fun warning(tag: String, message: String, throwable: Throwable) {
+        if (Log.isLoggable(tag, Log.WARN)) {
+            Log.w(tag, message, throwable)
+        }
+    }
+
+    @JvmStatic
+    fun error(tag: String, message: String) {
+        if (Log.isLoggable(tag, Log.ERROR)) {
+            Log.e(tag, message)
+        }
+    }
+
+    @JvmStatic
+    fun error(tag: String, message: String, throwable: Throwable) {
+        if (Log.isLoggable(tag, Log.ERROR)) {
+            Log.e(tag, message, throwable)
+        }
+    }
+}
diff --git a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt b/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt
index dd49758..4738040 100644
--- a/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt
+++ b/health/health-connect-client/src/test/java/androidx/health/platform/client/impl/data/ProtoParcelableTest.kt
@@ -15,15 +15,16 @@
  */
 package androidx.health.platform.client.impl.data
 
+import android.os.Build
 import android.os.Parcel
 import android.os.Parcelable
 import androidx.health.platform.client.proto.ByteString
 import androidx.health.platform.client.proto.BytesValue
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
-import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
 
 @RunWith(AndroidJUnit4::class)
 class ProtoParcelableTest {
@@ -37,8 +38,8 @@
         assertThat(parcelAndRead(protoParcelable).proto).isEqualTo(protoParcelable.proto)
     }
 
-    @Ignore // b/238635208
     @Test
+    @Config(sdk = [Build.VERSION_CODES.P])
     fun storeInSharedMemory() {
         // Big enough that it will be stored in shared memory.
         val protoParcelable =
diff --git a/javascriptengine/javascriptengine/api/current.txt b/javascriptengine/javascriptengine/api/current.txt
index e6f50d0..782c21f 100644
--- a/javascriptengine/javascriptengine/api/current.txt
+++ b/javascriptengine/javascriptengine/api/current.txt
@@ -1 +1,39 @@
 // Signature format: 4.0
+package androidx.javascriptengine {
+
+  public class EvaluationFailedException extends androidx.javascriptengine.JsException {
+    ctor public EvaluationFailedException(String);
+  }
+
+  public class IsolateTerminatedException extends androidx.javascriptengine.JsException {
+    ctor public IsolateTerminatedException();
+  }
+
+  public class JsException extends java.lang.Exception {
+    ctor public JsException(String);
+    ctor public JsException();
+  }
+
+  public class JsIsolate implements java.lang.AutoCloseable {
+    method public void close();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(String);
+    method @RequiresFeature(name=androidx.javascriptengine.JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER, enforcement="androidx.javascriptengine.JsSandbox#isFeatureSupported") public boolean provideNamedData(String, byte[]);
+  }
+
+  public class JsSandbox implements java.lang.AutoCloseable {
+    method public void close();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.javascriptengine.JsSandbox!> createConnectedInstanceAsync(android.content.Context);
+    method public androidx.javascriptengine.JsIsolate createIsolate();
+    method public boolean isFeatureSupported(String);
+    field public static final String JS_FEATURE_ISOLATE_TERMINATION = "JS_FEATURE_ISOLATE_TERMINATION";
+    field public static final String JS_FEATURE_PROMISE_RETURN = "JS_FEATURE_PROMISE_RETURN";
+    field public static final String JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER = "JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER";
+    field public static final String JS_FEATURE_WASM_COMPILATION = "JS_FEATURE_WASM_COMPILATION";
+  }
+
+  public class SandboxDeadException extends androidx.javascriptengine.JsException {
+    ctor public SandboxDeadException();
+  }
+
+}
+
diff --git a/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt b/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt
index e6f50d0..782c21f 100644
--- a/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt
+++ b/javascriptengine/javascriptengine/api/public_plus_experimental_current.txt
@@ -1 +1,39 @@
 // Signature format: 4.0
+package androidx.javascriptengine {
+
+  public class EvaluationFailedException extends androidx.javascriptengine.JsException {
+    ctor public EvaluationFailedException(String);
+  }
+
+  public class IsolateTerminatedException extends androidx.javascriptengine.JsException {
+    ctor public IsolateTerminatedException();
+  }
+
+  public class JsException extends java.lang.Exception {
+    ctor public JsException(String);
+    ctor public JsException();
+  }
+
+  public class JsIsolate implements java.lang.AutoCloseable {
+    method public void close();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(String);
+    method @RequiresFeature(name=androidx.javascriptengine.JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER, enforcement="androidx.javascriptengine.JsSandbox#isFeatureSupported") public boolean provideNamedData(String, byte[]);
+  }
+
+  public class JsSandbox implements java.lang.AutoCloseable {
+    method public void close();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.javascriptengine.JsSandbox!> createConnectedInstanceAsync(android.content.Context);
+    method public androidx.javascriptengine.JsIsolate createIsolate();
+    method public boolean isFeatureSupported(String);
+    field public static final String JS_FEATURE_ISOLATE_TERMINATION = "JS_FEATURE_ISOLATE_TERMINATION";
+    field public static final String JS_FEATURE_PROMISE_RETURN = "JS_FEATURE_PROMISE_RETURN";
+    field public static final String JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER = "JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER";
+    field public static final String JS_FEATURE_WASM_COMPILATION = "JS_FEATURE_WASM_COMPILATION";
+  }
+
+  public class SandboxDeadException extends androidx.javascriptengine.JsException {
+    ctor public SandboxDeadException();
+  }
+
+}
+
diff --git a/javascriptengine/javascriptengine/api/restricted_current.txt b/javascriptengine/javascriptengine/api/restricted_current.txt
index e6f50d0..782c21f 100644
--- a/javascriptengine/javascriptengine/api/restricted_current.txt
+++ b/javascriptengine/javascriptengine/api/restricted_current.txt
@@ -1 +1,39 @@
 // Signature format: 4.0
+package androidx.javascriptengine {
+
+  public class EvaluationFailedException extends androidx.javascriptengine.JsException {
+    ctor public EvaluationFailedException(String);
+  }
+
+  public class IsolateTerminatedException extends androidx.javascriptengine.JsException {
+    ctor public IsolateTerminatedException();
+  }
+
+  public class JsException extends java.lang.Exception {
+    ctor public JsException(String);
+    ctor public JsException();
+  }
+
+  public class JsIsolate implements java.lang.AutoCloseable {
+    method public void close();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.String!> evaluateJavaScriptAsync(String);
+    method @RequiresFeature(name=androidx.javascriptengine.JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER, enforcement="androidx.javascriptengine.JsSandbox#isFeatureSupported") public boolean provideNamedData(String, byte[]);
+  }
+
+  public class JsSandbox implements java.lang.AutoCloseable {
+    method public void close();
+    method public static com.google.common.util.concurrent.ListenableFuture<androidx.javascriptengine.JsSandbox!> createConnectedInstanceAsync(android.content.Context);
+    method public androidx.javascriptengine.JsIsolate createIsolate();
+    method public boolean isFeatureSupported(String);
+    field public static final String JS_FEATURE_ISOLATE_TERMINATION = "JS_FEATURE_ISOLATE_TERMINATION";
+    field public static final String JS_FEATURE_PROMISE_RETURN = "JS_FEATURE_PROMISE_RETURN";
+    field public static final String JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER = "JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER";
+    field public static final String JS_FEATURE_WASM_COMPILATION = "JS_FEATURE_WASM_COMPILATION";
+  }
+
+  public class SandboxDeadException extends androidx.javascriptengine.JsException {
+    ctor public SandboxDeadException();
+  }
+
+}
+
diff --git a/javascriptengine/javascriptengine/build.gradle b/javascriptengine/javascriptengine/build.gradle
index 69ad2ab..ed63ae3 100644
--- a/javascriptengine/javascriptengine/build.gradle
+++ b/javascriptengine/javascriptengine/build.gradle
@@ -22,11 +22,26 @@
 }
 
 dependencies {
+    api("androidx.annotation:annotation:1.3.0")
+    api("androidx.concurrent:concurrent-futures:1.0.0")
+    api("androidx.core:core:1.1.0")
+    implementation(libs.guavaAndroid)
+    androidTestImplementation 'junit:junit:4.12'
     annotationProcessor(libs.nullaway)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
     // Add dependencies here
 }
 
 android {
+    defaultConfig {
+        minSdkVersion 26
+    }
+    buildFeatures {
+        aidl = true
+    }
     namespace "androidx.javascriptengine"
 }
 
diff --git a/javascriptengine/javascriptengine/lint.xml b/javascriptengine/javascriptengine/lint.xml
new file mode 100644
index 0000000..a4991e9
--- /dev/null
+++ b/javascriptengine/javascriptengine/lint.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+    <!-- AndroidX global lint rules from ../buildSrc/lint.xml -->
+    <issue id="LintBaseline" severity="ignore">
+        <ignore regexp=".* filtered out because .* listed in the baseline file.*"/>
+    </issue>
+    <!-- Re-enable high-priority checks for tests (and everything else). -->
+    <issue id="NewApi" severity="fatal" />
+    <issue id="WrongThread" severity="fatal" />
+    <issue id="MissingTestSizeAnnotation" severity="fatal" />
+    <!-- We cannot cause ClassVerificationFailure in embedding apps -->
+    <issue id="ClassVerificationFailure" severity="fatal" />
+    <!-- Developers need to call our code from Kotlin code, so nullness is important.-->
+    <issue id="UnknownNullness" severity="fatal" />
+</lint>
diff --git a/javascriptengine/javascriptengine/src/androidTest/AndroidManifest.xml b/javascriptengine/javascriptengine/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..687d459
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?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">
+    <application>
+    </application>
+</manifest>
diff --git a/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJsSandboxTest.java b/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJsSandboxTest.java
new file mode 100644
index 0000000..195bd05
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/androidTest/java/androidx/javascriptengine/WebViewJsSandboxTest.java
@@ -0,0 +1,511 @@
+/*
+ * 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.javascriptengine;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Vector;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+/** Instrumentation test for JsSandboxService. */
+@RunWith(AndroidJUnit4.class)
+public class WebViewJsSandboxTest {
+    private boolean canCreateJsSandbox() throws Throwable {
+        Context context = ApplicationProvider.getApplicationContext();
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox;
+        try {
+            jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        } catch (ExecutionException e) {
+            return false;
+        }
+        jsSandbox.close();
+        return true;
+    }
+
+    @Before
+    public void setUp() throws Throwable {
+        // Ensure WebView version supports creation of sandbox. Remove this once we have a client
+        // side check.
+        Assume.assumeTrue(canCreateJsSandbox());
+    }
+
+    @Test
+    @MediumTest
+    public void testSimpleJsEvaluation() throws Throwable {
+        final String code = "\"PASS\"";
+        final String expected = "PASS";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+        String result = resultFuture.get(5, TimeUnit.SECONDS);
+        jsIsolate.close();
+        jsSandbox.close();
+
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    @MediumTest
+    public void testClosingOneIsolate() throws Throwable {
+        final String code = "'PASS'";
+        final String expected = "PASS";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate1 = jsSandbox.createIsolate();
+        JsIsolate jsIsolate2 = jsSandbox.createIsolate();
+        jsIsolate1.close();
+        ListenableFuture<String> resultFuture = jsIsolate2.evaluateJavaScriptAsync(code);
+        String result = resultFuture.get(5, TimeUnit.SECONDS);
+        jsIsolate2.close();
+        jsSandbox.close();
+
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    @MediumTest
+    public void testEvaluationInTwoIsolates() throws Throwable {
+        final String code1 = "this.x = 'PASS';\n";
+        final String expected1 = "PASS";
+        final String code2 = "this.x = 'SUPER_PASS';\n";
+        final String expected2 = "SUPER_PASS";
+
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate1 = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
+        String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate2 = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture2 = jsIsolate2.evaluateJavaScriptAsync(code2);
+        String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
+        jsIsolate1.close();
+        jsIsolate2.close();
+        jsSandbox.close();
+
+        Assert.assertEquals(expected1, result1);
+        Assert.assertEquals(expected2, result2);
+    }
+
+    @Test
+    @MediumTest
+    public void testTwoIsolatesDoNotShareEnvironment() throws Throwable {
+        final String code1 = "this.y = 'PASS';\n";
+        final String expected1 = "PASS";
+        final String code2 = "this.y = this.y + ' PASS';\n";
+        final String expected2 = "undefined PASS";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate1 = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
+        String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate2 = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture2 = jsIsolate2.evaluateJavaScriptAsync(code2);
+        String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
+        jsIsolate1.close();
+        jsIsolate2.close();
+        jsSandbox.close();
+
+        Assert.assertEquals(expected1, result1);
+        Assert.assertEquals(expected2, result2);
+    }
+
+    @Test
+    @MediumTest
+    public void testTwoExecutionsShareEnvironment() throws Throwable {
+        final String code1 = "this.z = 'PASS';\n";
+        final String expected1 = "PASS";
+        final String code2 = "this.z = this.z + ' PASS';\n";
+        final String expected2 = "PASS PASS";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate1 = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture1 = jsIsolate1.evaluateJavaScriptAsync(code1);
+        String result1 = resultFuture1.get(5, TimeUnit.SECONDS);
+        ListenableFuture<String> resultFuture2 = jsIsolate1.evaluateJavaScriptAsync(code2);
+        String result2 = resultFuture2.get(5, TimeUnit.SECONDS);
+        jsIsolate1.close();
+        jsSandbox.close();
+
+        Assert.assertEquals(expected1, result1);
+        Assert.assertEquals(expected2, result2);
+    }
+
+    @Test
+    @MediumTest
+    public void testJsEvaluationError() throws Throwable {
+        final String code = "throw new WebAssembly.LinkError('RandomLinkError');";
+        final String contains = "RandomLinkError";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+        boolean isOfCorrectType = false;
+        String error = "";
+        try {
+            String result = resultFuture.get(5, TimeUnit.SECONDS);
+        } catch (ExecutionException e) {
+            isOfCorrectType = e.getCause().getClass().equals(EvaluationFailedException.class);
+            error = e.getCause().getMessage();
+        }
+        jsIsolate.close();
+        jsSandbox.close();
+
+        Assert.assertTrue(isOfCorrectType);
+        Assert.assertTrue(error.contains(contains));
+    }
+
+    @Test
+    @MediumTest
+    public void testInfiniteLoop() throws Throwable {
+        final String code = "while(true){}";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_ISOLATE_TERMINATION));
+
+        JsIsolate jsIsolate = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+        boolean isOfCorrectType = false;
+        try {
+            jsIsolate.close();
+            String result = resultFuture.get(5, TimeUnit.SECONDS);
+        } catch (ExecutionException e) {
+            isOfCorrectType = e.getCause().getClass().equals(IsolateTerminatedException.class);
+        }
+        jsSandbox.close();
+
+        Assert.assertTrue(isOfCorrectType);
+    }
+
+    @Test
+    @MediumTest
+    public void testMultipleInfiniteLoops() throws Throwable {
+        final String code = "while(true){}";
+        final int num_of_evaluations = 10;
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_ISOLATE_TERMINATION));
+
+        JsIsolate jsIsolate = jsSandbox.createIsolate();
+        Vector<ListenableFuture<String>> resultFutures = new Vector<ListenableFuture<String>>();
+        for (int i = 0; i < num_of_evaluations; i++) {
+            ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+            resultFutures.add(resultFuture);
+        }
+        jsIsolate.close();
+
+        for (int i = 0; i < num_of_evaluations; i++) {
+            boolean isOfCorrectType = false;
+            try {
+                String result = resultFutures.elementAt(i).get(5, TimeUnit.SECONDS);
+            } catch (ExecutionException e) {
+                isOfCorrectType = e.getCause().getClass().equals(IsolateTerminatedException.class);
+            }
+            Assert.assertTrue(isOfCorrectType);
+        }
+        jsSandbox.close();
+    }
+
+    @Test
+    @MediumTest
+    public void testSimpleArrayBuffer() throws Throwable {
+        final String provideString = "Hello World";
+        final byte[] bytes = provideString.getBytes(StandardCharsets.US_ASCII);
+        final String code = ""
+                + "function ab2str(buf) {"
+                + " return String.fromCharCode.apply(null, new Uint8Array(buf));"
+                + "}"
+                + "android.consumeNamedDataAsArrayBuffer(\"id-1\").then((value) => {"
+                + " return ab2str(value);"
+                + "});";
+        Context context = ApplicationProvider.getApplicationContext();
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+             JsIsolate jsIsolate = jsSandbox.createIsolate()) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_PROMISE_RETURN));
+            Assume.assumeTrue(
+                    jsSandbox.isFeatureSupported(
+                            JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
+
+            boolean provideNamedDataReturn = jsIsolate.provideNamedData("id-1", bytes);
+            Assert.assertTrue(provideNamedDataReturn);
+            ListenableFuture<String> resultFuture1 = jsIsolate.evaluateJavaScriptAsync(code);
+            String result = resultFuture1.get(5, TimeUnit.SECONDS);
+
+            Assert.assertEquals(provideString, result);
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testArrayBufferWasmCompilation() throws Throwable {
+        final String success = "success";
+        // The bytes of a minimal WebAssembly module, courtesy of v8/test/cctest/test-api-wasm.cc
+        final byte[] bytes = {0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00};
+        final String code = ""
+                + "android.consumeNamedDataAsArrayBuffer(\"id-1\").then((value) => {"
+                + " return WebAssembly.compile(value).then((module) => {"
+                + "  return \"success\";"
+                + "  });"
+                + "});";
+        Context context = ApplicationProvider.getApplicationContext();
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+             JsIsolate jsIsolate = jsSandbox.createIsolate()) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_PROMISE_RETURN));
+            Assume.assumeTrue(
+                    jsSandbox.isFeatureSupported(
+                            JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_WASM_COMPILATION));
+
+            boolean provideNamedDataReturn = jsIsolate.provideNamedData("id-1", bytes);
+            Assert.assertTrue(provideNamedDataReturn);
+            ListenableFuture<String> resultFuture1 = jsIsolate.evaluateJavaScriptAsync(code);
+            String result = resultFuture1.get(5, TimeUnit.SECONDS);
+
+            Assert.assertEquals(success, result);
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testPromiseReturn() throws Throwable {
+        final String code = "Promise.resolve(\"PASS\")";
+        final String expected = "PASS";
+        Context context = ApplicationProvider.getApplicationContext();
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+             JsIsolate jsIsolate = jsSandbox.createIsolate()) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_PROMISE_RETURN));
+
+            ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+            String result = resultFuture.get(5, TimeUnit.SECONDS);
+
+            Assert.assertEquals(expected, result);
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testPromiseReturnLaterResolve() throws Throwable {
+        final String code1 = "var promiseResolve, promiseReject;"
+                + "new Promise(function(resolve, reject){"
+                + "  promiseResolve = resolve;"
+                + "  promiseReject = reject;"
+                + "});";
+        final String code2 = "promiseResolve(\"PASS\");";
+        final String expected = "PASS";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+             JsIsolate jsIsolate = jsSandbox.createIsolate()) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_PROMISE_RETURN));
+
+            ListenableFuture<String> resultFuture1 = jsIsolate.evaluateJavaScriptAsync(code1);
+            ListenableFuture<String> resultFuture2 = jsIsolate.evaluateJavaScriptAsync(code2);
+            String result = resultFuture1.get(5, TimeUnit.SECONDS);
+
+            Assert.assertEquals(expected, result);
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testNestedConsumeNamedDataAsArrayBuffer() throws Throwable {
+        final String success = "success";
+        // The bytes of a minimal WebAssembly module, courtesy of v8/test/cctest/test-api-wasm.cc
+        final byte[] bytes = {0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00};
+        final String code = ""
+                + "android.consumeNamedDataAsArrayBuffer(\"id-1\").then((value) => {"
+                + " return android.consumeNamedDataAsArrayBuffer(\"id-2\").then((value) => {"
+                + "  return android.consumeNamedDataAsArrayBuffer(\"id-3\").then((value) => {"
+                + "   return android.consumeNamedDataAsArrayBuffer(\"id-4\").then((value) => {"
+                + "    return android.consumeNamedDataAsArrayBuffer(\"id-5\").then((value) => {"
+                + "     return \"success\";"
+                + "     }, (error) => {"
+                + "     return error.message;"
+                + "    });"
+                + "   });"
+                + "  });"
+                + " });"
+                + "});";
+        Context context = ApplicationProvider.getApplicationContext();
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+             JsIsolate jsIsolate = jsSandbox.createIsolate()) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_PROMISE_RETURN));
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(
+                    JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
+
+            jsIsolate.provideNamedData("id-1", bytes);
+            jsIsolate.provideNamedData("id-2", bytes);
+            jsIsolate.provideNamedData("id-3", bytes);
+            jsIsolate.provideNamedData("id-4", bytes);
+            jsIsolate.provideNamedData("id-5", bytes);
+            Thread.sleep(1000);
+            ListenableFuture<String> resultFuture1 = jsIsolate.evaluateJavaScriptAsync(code);
+            String result = resultFuture1.get(5, TimeUnit.SECONDS);
+
+            Assert.assertEquals(success, result);
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testPromiseEvaluationThrow() throws Throwable {
+        final String provideString = "Hello World";
+        final byte[] bytes = provideString.getBytes(StandardCharsets.US_ASCII);
+        final String code = ""
+                + "android.consumeNamedDataAsArrayBuffer(\"id-1\").catch((error) => {"
+                + " throw new WebAssembly.LinkError('RandomLinkError');"
+                + "});";
+        final String contains = "RandomLinkError";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+             JsIsolate jsIsolate = jsSandbox.createIsolate()) {
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(JsSandbox.JS_FEATURE_PROMISE_RETURN));
+            Assume.assumeTrue(jsSandbox.isFeatureSupported(
+                    JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER));
+
+            ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+            try {
+                String result = resultFuture.get(5, TimeUnit.SECONDS);
+                Assert.fail("Should have thrown.");
+            } catch (ExecutionException e) {
+                if (!(e.getCause() instanceof EvaluationFailedException)) {
+                    throw e;
+                }
+                Assert.assertTrue(e.getCause().getMessage().contains(contains));
+            }
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testEvaluationThrowsWhenSandboxDead() throws Throwable {
+        final String code = "while(true){}";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox = JsSandboxFuture.get(5, TimeUnit.SECONDS);
+        JsIsolate jsIsolate = jsSandbox.createIsolate();
+        ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
+        try {
+            jsSandbox.close();
+            resultFuture.get(5, TimeUnit.SECONDS);
+            Assert.fail("Should have thrown.");
+        } catch (ExecutionException e) {
+            if (!(e.getCause() instanceof IsolateTerminatedException)) {
+                throw e;
+            }
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testMultipleSandboxesCannotCoexist() throws Throwable {
+        Context context = ApplicationProvider.getApplicationContext();
+        final String contains = "already bound";
+        ListenableFuture<JsSandbox> JsSandboxFuture1 =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox1 = JsSandboxFuture1.get(5, TimeUnit.SECONDS)) {
+            ListenableFuture<JsSandbox> JsSandboxFuture2 =
+                    JsSandbox.createConnectedInstanceAsync(context);
+            try {
+                JsSandbox jsSandbox2 = JsSandboxFuture2.get(5, TimeUnit.SECONDS);
+                Assert.fail("Should have thrown.");
+            } catch (ExecutionException e) {
+                if (!(e.getCause() instanceof RuntimeException)) {
+                    throw e;
+                }
+                Assert.assertTrue(e.getCause().getMessage().contains(contains));
+            }
+        }
+    }
+
+    @Test
+    @MediumTest
+    public void testSandboxCanBeCreatedAfterClosed() throws Throwable {
+        final String code = "\"PASS\"";
+        final String expected = "PASS";
+        Context context = ApplicationProvider.getApplicationContext();
+
+        ListenableFuture<JsSandbox> JsSandboxFuture1 =
+                JsSandbox.createConnectedInstanceAsync(context);
+        JsSandbox jsSandbox1 = JsSandboxFuture1.get(5, TimeUnit.SECONDS);
+        jsSandbox1.close();
+        ListenableFuture<JsSandbox> JsSandboxFuture2 =
+                JsSandbox.createConnectedInstanceAsync(context);
+        try (JsSandbox jsSandbox2 = JsSandboxFuture2.get(5, TimeUnit.SECONDS);
+             JsIsolate jsIsolate = jsSandbox2.createIsolate()) {
+            ListenableFuture<String> resultFuture1 = jsIsolate.evaluateJavaScriptAsync(code);
+            String result = resultFuture1.get(5, TimeUnit.SECONDS);
+
+            Assert.assertEquals(expected, result);
+        }
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/AndroidManifest.xml b/javascriptengine/javascriptengine/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8e90956
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?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 />
diff --git a/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxIsolate.aidl b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxIsolate.aidl
new file mode 100644
index 0000000..388f324
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxIsolate.aidl
@@ -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 org.chromium.android_webview.js_sandbox.common;
+
+import android.content.res.AssetFileDescriptor;
+import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolateCallback;
+
+/**
+ * Used by the embedding app to execute JavaScript in a sandboxed environment.
+ * @hide
+ */
+interface IJsSandboxIsolate {
+    /**
+     * @param code the JavaScript code
+     * to be evaluated in the sandbox.
+     * @param callback used to pass the information back to the embedding app
+     * from the sandbox.
+     */
+    void evaluateJavascript(String code, in IJsSandboxIsolateCallback callback) = 0;
+
+    /**
+     * Stop the execution of the Isolate as soon as possible and destroy it.
+     */
+    void close() = 1;
+
+    /**
+     * Provides the data represented by afd such that it can be
+     * retrieved in the JS code by calling `consumeNamedDataAs*(name)` APIs.
+     * @param name   the id used to refer to the data in JS.
+     * @param afd    input AssetFileDescriptor which will be read to retrieve data.
+     * @return     true if data with the given name can be retrieved
+     *             in JS code, else false.
+     */
+    boolean provideNamedData(String name, in AssetFileDescriptor afd) = 2;
+}
diff --git a/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxIsolateCallback.aidl b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxIsolateCallback.aidl
new file mode 100644
index 0000000..da9b880
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxIsolateCallback.aidl
@@ -0,0 +1,32 @@
+/*
+ * 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 org.chromium.android_webview.js_sandbox.common;
+
+/**
+ * Used to communicate the result of the JavaScript evaluation from the
+ * sandbox to the embedding app.
+ * @hide
+ */
+oneway interface IJsSandboxIsolateCallback {
+    // An exception was thrown during the JS evaluation.
+    const int JS_EVALUATION_ERROR = 0;
+
+    void reportResult(String result) = 0;
+
+    // errorType is one of the error constants above.
+    void reportError(int errorType, String error) = 1;
+}
diff --git a/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
new file mode 100644
index 0000000..55f34a8
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/aidl/org/chromium/android_webview/js_sandbox/common/IJsSandboxService.aidl
@@ -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 org.chromium.android_webview.js_sandbox.common;
+import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolate;
+
+/**
+ * Used by the embedding app to execute JavaScript in a sandboxed environment.
+ * @hide
+ */
+interface IJsSandboxService {
+    IJsSandboxIsolate createIsolate() = 0;
+
+    /**
+     * Feature flag indicating that closing an isolate will terminate its
+     * execution as soon as possible, instead of allowing previously-requested
+     * executions to run to completion first.
+     */
+    const String ISOLATE_TERMINATION = "ISOLATE_TERMINATION";
+
+    /**
+     * This feature flag is a combination of three sub-features:
+     * - If evaluateJavascript() returns a promise, we wait for the promise
+     *   to resolve and then return the resolved value.
+     * - Supports Java API provideNamedData() and JS API
+     *   android.consumeNamedDataAsArrayBuffer().
+     * - WebAssembly.compile() API is supported. Wasm can be compiled from
+     *   an array buffer.
+     */
+    const String WASM_FROM_ARRAY_BUFFER = "WASM_FROM_ARRAY_BUFFER";
+
+    /**
+     * @return A list of feature names supported by this implementation.
+     */
+    List<String> getSupportedFeatures() = 1;
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/CloseGuardHelper.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/CloseGuardHelper.java
new file mode 100644
index 0000000..364b7b8
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/CloseGuardHelper.java
@@ -0,0 +1,115 @@
+/*
+ * 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.javascriptengine;
+
+import android.os.Build;
+import android.util.CloseGuard;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.core.util.Preconditions;
+
+/**
+ * Helper for accessing CloseGuard on API levels that support it.
+ *
+ * <p>All operations are no-ops on non-supported API levels.
+ */
+@SuppressWarnings("NotCloseable")
+final class CloseGuardHelper {
+    private final CloseGuardImpl mImpl;
+
+    private CloseGuardHelper(CloseGuardImpl impl) {
+        mImpl = impl;
+    }
+
+    /**
+     * Returns a {@link CloseGuardHelper} which defers to the platform close guard if it is
+     * available.
+     */
+    @NonNull
+    public static CloseGuardHelper create() {
+        if (Build.VERSION.SDK_INT >= 30) {
+            return new CloseGuardHelper(new CloseGuardApi30Impl());
+        }
+
+        return new CloseGuardHelper(new CloseGuardNoOpImpl());
+    }
+
+    /**
+     * Initializes the instance with a warning that the caller should have explicitly called the
+     * {@code closeMethodName} method instead of relying on finalization.
+     *
+     * @param closeMethodName non-null name of explicit termination method. Printed by
+     *                        warnIfOpen.
+     * @throws NullPointerException if closeMethodName is null.
+     */
+    public void open(@NonNull String closeMethodName) {
+        mImpl.open(closeMethodName);
+    }
+
+    /** Marks this CloseGuard instance as closed to avoid warnings on finalization. */
+    public void close() {
+        mImpl.close();
+    }
+
+    /**
+     * Logs a warning if the caller did not properly cleanup by calling an explicit close method
+     * before finalization.
+     */
+    public void warnIfOpen() {
+        mImpl.warnIfOpen();
+    }
+
+    private interface CloseGuardImpl {
+        void open(@NonNull String closeMethodName);
+        void close();
+        void warnIfOpen();
+    }
+
+    @RequiresApi(30)
+    static final class CloseGuardApi30Impl implements CloseGuardImpl {
+        private final CloseGuard mPlatformImpl = new CloseGuard();
+
+        @Override
+        public void open(@NonNull String closeMethodName) {
+            mPlatformImpl.open(closeMethodName);
+        }
+
+        @Override
+        public void close() {
+            mPlatformImpl.close();
+        }
+
+        @Override
+        public void warnIfOpen() {
+            mPlatformImpl.warnIfOpen();
+        }
+    }
+
+    static final class CloseGuardNoOpImpl implements CloseGuardImpl {
+        @Override
+        public void open(@NonNull String closeMethodName) {
+            Preconditions.checkNotNull(closeMethodName, "CloseMethodName must not be null.");
+        }
+
+        @Override
+        public void close() {}
+
+        @Override
+        public void warnIfOpen() {}
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/EvaluationFailedException.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/EvaluationFailedException.java
new file mode 100644
index 0000000..179cac9
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/EvaluationFailedException.java
@@ -0,0 +1,26 @@
+/*
+ * 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.javascriptengine;
+
+import androidx.annotation.NonNull;
+
+/** Wrapper for the exception thrown by the JS evaluation engine. */
+public class EvaluationFailedException extends JsException {
+    public EvaluationFailedException(@NonNull String error) {
+        super(error);
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/ExecutionErrorTypes.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/ExecutionErrorTypes.java
new file mode 100644
index 0000000..3a40bc5a
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/ExecutionErrorTypes.java
@@ -0,0 +1,33 @@
+/*
+ * 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.javascriptengine;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.RestrictTo;
+
+import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolateCallback;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/** @hide */
+@IntDef(value = {ExecutionErrorTypes.JS_EVALUATION_ERROR})
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@Retention(RetentionPolicy.SOURCE)
+public @interface ExecutionErrorTypes {
+    int JS_EVALUATION_ERROR = IJsSandboxIsolateCallback.JS_EVALUATION_ERROR;
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/IsolateTerminatedException.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/IsolateTerminatedException.java
new file mode 100644
index 0000000..8c4b514
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/IsolateTerminatedException.java
@@ -0,0 +1,26 @@
+/*
+ * 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.javascriptengine;
+
+/**
+ * Exception thrown when evaluation is terminated due the {@link JsIsolate} being terminated.
+ */
+public class IsolateTerminatedException extends JsException {
+    public IsolateTerminatedException() {
+        super();
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsException.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsException.java
new file mode 100644
index 0000000..0d3f38f
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.javascriptengine;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Super class for all exceptions resolved by {@link JsIsolate#evaluateJavaScriptAsync(String)}.
+ */
+public class JsException extends Exception {
+    public JsException(@NonNull String error) {
+        super(error);
+    }
+
+    public JsException() {
+        super();
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsIsolate.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsIsolate.java
new file mode 100644
index 0000000..4e5fb80
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsIsolate.java
@@ -0,0 +1,336 @@
+/*
+ * 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.javascriptengine;
+
+import android.content.res.AssetFileDescriptor;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresFeature;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolate;
+import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolateCallback;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashSet;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import javax.annotation.concurrent.GuardedBy;
+
+/**
+ * Environment within a {@link JsSandbox} where Javascript is executed.
+ *
+ * A single {@link JsSandbox} process can contain any number of {@link JsIsolate} instances where JS
+ * can be evaluated independently and in parallel.
+ * <p>
+ * Each isolate has its own state and JS global object,
+ * and cannot interact with any other isolate through JS APIs. There is only a <em>moderate</em>
+ * security boundary between isolates in a single {@link JsSandbox}. If the code in one {@link
+ * JsIsolate} is able to compromise the security of the JS engine then it may be able to observe or
+ * manipulate other isolates, since they run in the same process. For strong isolation multiple
+ * {@link JsSandbox} processes should be used, but it is not supported at the moment.
+ * <p>
+ * Each isolate object must only be used from one thread.
+ */
+public class JsIsolate implements AutoCloseable {
+    private static final String TAG = "JsIsolate";
+    private final Object mSetLock = new Object();
+    @Nullable
+    private IJsSandboxIsolate mJsIsolateStub;
+    private CloseGuardHelper mGuard = CloseGuardHelper.create();
+    private final Executor mThreadPoolTaskExecutor =
+            Executors.newCachedThreadPool(new ThreadFactory() {
+                private final AtomicInteger mCount = new AtomicInteger(1);
+
+                @Override
+                public Thread newThread(Runnable r) {
+                    return new Thread(r, "JsIsolate Thread #" + mCount.getAndIncrement());
+                }
+            });
+    private final JsSandbox mJsSandbox;
+
+    @Nullable
+    @GuardedBy("mSetLock")
+    private HashSet<CallbackToFutureAdapter.Completer<String>> mPendingCompleterSet =
+            new HashSet<CallbackToFutureAdapter.Completer<String>>();
+
+    private class IJsSandboxIsolateCallbackStubWrapper extends IJsSandboxIsolateCallback.Stub {
+        private CallbackToFutureAdapter.Completer<String> mCompleter;
+
+        IJsSandboxIsolateCallbackStubWrapper(CallbackToFutureAdapter.Completer<String> completer) {
+            mCompleter = completer;
+        }
+
+        @Override
+        public void reportResult(String result) {
+            mCompleter.set(result);
+            removePending(mCompleter);
+        }
+
+        @Override
+        public void reportError(@ExecutionErrorTypes int type, String error) {
+            assert type == IJsSandboxIsolateCallback.JS_EVALUATION_ERROR;
+            mCompleter.setException(new EvaluationFailedException(error));
+            removePending(mCompleter);
+        }
+    }
+
+    JsIsolate(IJsSandboxIsolate jsIsolateStub, JsSandbox sandbox) {
+        mJsSandbox = sandbox;
+        mJsIsolateStub = jsIsolateStub;
+        mGuard.open("close");
+        // This should be at the end of the constructor.
+    }
+
+    /**
+     * Evaluates the given JavaScript code and returns the result.
+     *
+     * There are 3 possible behaviors based on the output of the expression:
+     * <ul>
+     *   <li><strong>If the JS expression returns a JS String</strong>, then the Java Future
+     * resolves to Java String.</li>
+     *   <li><strong>If the JS expression returns a JS Promise</strong>,
+     * and if {@link JsSandbox#isFeatureSupported(String)} for
+     * {@link JsSandbox#JS_FEATURE_PROMISE_RETURN} returns {@code true}, Java Future resolves to
+     * Java String once the promise resolves. If it returns {@code false}, then the Future
+     * resolves to an empty string.</li>
+     *   <li><strong>If the JS expression returns another data type</strong>, then Java Future
+     * resolves to empty Java String.</li>
+     * </ul>
+     * The environment uses a single JS global object for all the calls to {@link
+     * #evaluateJavaScriptAsync(String)} and {@link #provideNamedData(String, byte[])} methods.
+     * These calls are queued up and are run one at a time in sequence, using the single JS
+     * environment for the isolate. The global variables set by one evaluation are visible for
+     * later evaluations. This is similar to adding multiple {@code <script>} tags in HTML. The
+     * behavior is also similar to
+     * {@link android.webkit.WebView#evaluateJavascript(String, android.webkit.ValueCallback)}.
+     * <p>
+     * Size of the expression to be evaluated and the result are both limited by the binder
+     * transaction limit. Refer {@link android.os.TransactionTooLargeException} for more details.
+     *
+     * @param code JavaScript code that is evaluated, it should return a JavaScript String or a
+     *         Promise of a String in case {@link JsSandbox#JS_FEATURE_PROMISE_RETURN} is supported
+     *
+     * @return Future that evaluates to the result String of the evaluation or exceptions({@link
+     *         IsolateTerminatedException}, {@link SandboxDeadException}) if there is an error
+     */
+    @SuppressWarnings("NullAway")
+    @NonNull
+    public ListenableFuture<String> evaluateJavaScriptAsync(@NonNull String code) {
+        if (mJsIsolateStub == null) {
+            throw new IllegalStateException(
+                    "Calling evaluateJavascript() after closing the Isolate");
+        }
+
+        return CallbackToFutureAdapter.getFuture(completer -> {
+            final String futureDebugMessage = "evaluateJavascript Future";
+            IJsSandboxIsolateCallbackStubWrapper callbackStub;
+            synchronized (mSetLock) {
+                if (mPendingCompleterSet == null) {
+                    completer.setException(new IsolateTerminatedException());
+                    return futureDebugMessage;
+                }
+                mPendingCompleterSet.add(completer);
+            }
+            callbackStub = new IJsSandboxIsolateCallbackStubWrapper(completer);
+            try {
+                mJsIsolateStub.evaluateJavascript(code, callbackStub);
+            } catch (RemoteException e) {
+                completer.setException(new RuntimeException(e));
+                synchronized (mSetLock) {
+                    mPendingCompleterSet.remove(completer);
+                }
+            }
+
+            // Debug string.
+            return futureDebugMessage;
+        });
+    }
+
+    /**
+     * Closes the {@link JsIsolate} object and renders it unusable.
+     *
+     * Once closed, no more method calls should be made. Pending evaluations resolve with
+     * {@link IsolateTerminatedException} immediately.
+     * <p>
+     * If {@link JsSandbox#isFeatureSupported(String)} is {@code true} for {@link
+     * JsSandbox#JS_FEATURE_ISOLATE_TERMINATION}, then any pending evaluation is immediately
+     * terminated and memory is freed. If it is {@code false}, the isolate will not get cleaned
+     * up until the pending evaluations have run to completion and will consume resources until
+     * then.
+     */
+    @Override
+    public void close() {
+        if (mJsIsolateStub == null) {
+            return;
+        }
+        try {
+            cancelAllPendingEvaluations(new IsolateTerminatedException());
+            mJsIsolateStub.close();
+        } catch (RemoteException e) {
+            Log.e(TAG, "RemoteException was thrown during close()", e);
+        }
+        mJsIsolateStub = null;
+        mJsSandbox.removeFromIsolateSet(this);
+        mGuard.close();
+    }
+
+    /**
+     * Provides a byte array for consumption from the JavaScript environment.
+     *
+     * This method provides an efficient way to pass in data from Java into the JavaScript
+     * environment which can be referred to from JavaScript. This is more efficient than including
+     * data in the JS expression, and allows large data to be sent.
+     * <p>
+     * This data can be consumed in the JS environment using {@code
+     * android.consumeNamedDataAsArrayBuffer(String)} by referring to the data with the name that
+     * was used when calling this method. This is a one-time transfer and the calls should be
+     * paired.
+     * <p>
+     * A single name can only be used once in a particular {@link JsIsolate}.
+     * Clients can generate unique names for each call if they
+     * need to use this method multiple times. The same name should be included into the JS code.
+     * <p>
+     * This API can be used to pass a WASM module into the JS
+     * environment for compilation if {@link JsSandbox#isFeatureSupported(String)} returns {@code
+     * true} for {@link JsSandbox#JS_FEATURE_WASM_COMPILATION}.
+     * <br>
+     * In Java,
+     * <pre>
+     *     jsIsolate.provideNamedData("id-1", byteArray);
+     * </pre>
+     * In JS,
+     * <pre>
+     *     android.consumeNamedDataAsArrayBuffer("id-1").then((value) => {
+     *       return WebAssembly.compile(value).then((module) => {
+     *          ...
+     *       });
+     *     });
+     * </pre>
+     * <p>
+     * The environment uses a single JS global object for all the calls to {@link
+     * #evaluateJavaScriptAsync(String)} and {@link #provideNamedData(String, byte[])} methods.
+     * <p>
+     * This method should only be called if
+     * {@link JsSandbox#isFeatureSupported(String)}
+     * returns true for {@link JsSandbox#JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER}.
+     *
+     * @param name Identifier for the data that is passed, the same identifier should be used in the
+     *         JavaScript environment to refer to the data
+     * @param inputBytes Bytes to be passed into the JavaScript environment
+     *
+     * @return {@code true} on success, {@code false} otherwise
+     */
+    @RequiresFeature(name = JsSandbox.JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER,
+            enforcement =
+                    "androidx.javascriptengine.JsSandbox#isFeatureSupported")
+    public boolean provideNamedData(@NonNull String name, @NonNull byte[] inputBytes) {
+        if (mJsIsolateStub == null) {
+            throw new IllegalStateException("Calling provideNamedData() after closing the Isolate");
+        }
+        if (name == null) {
+            throw new NullPointerException("name parameter cannot be null");
+        }
+        try {
+            final long offset = 0;
+            final long length = inputBytes.length;
+            ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
+            ParcelFileDescriptor readSide = pipe[0];
+            ParcelFileDescriptor writeSide = pipe[1];
+            OutputStream outputStream = new ParcelFileDescriptor.AutoCloseOutputStream(writeSide);
+            mThreadPoolTaskExecutor.execute(
+                    () -> {
+                        convertByteArrayToStream(inputBytes, outputStream);
+                    }
+            );
+
+            AssetFileDescriptor asd = new AssetFileDescriptor(readSide, offset, length);
+            return mJsIsolateStub.provideNamedData(name, asd);
+        } catch (RemoteException e) {
+            Log.e(TAG, "RemoteException was thrown during provideNamedData()", e);
+        } catch (IOException e) {
+            Log.e(TAG, "IOException was thrown during provideNamedData", e);
+        }
+        return false;
+    }
+
+    private void convertByteArrayToStream(byte[] inputBytes, OutputStream outputStream) {
+        try {
+            outputStream.write(inputBytes);
+            outputStream.flush();
+        } catch (IOException e) {
+            Log.e(TAG, "Writing to outputStream failed", e);
+        } finally {
+            closeQuietly(outputStream);
+        }
+    }
+
+    void cancelAllPendingEvaluations(Exception e) {
+        final HashSet<CallbackToFutureAdapter.Completer<String>> pendingSet;
+        synchronized (mSetLock) {
+            if (mPendingCompleterSet == null) return;
+            pendingSet = mPendingCompleterSet;
+            mPendingCompleterSet = null;
+        }
+        for (CallbackToFutureAdapter.Completer<String> ele : pendingSet) {
+            ele.setException(e);
+        }
+    }
+
+    void removePending(CallbackToFutureAdapter.Completer<String> completer) {
+        synchronized (mSetLock) {
+            if (mPendingCompleterSet != null) {
+                mPendingCompleterSet.remove(completer);
+            }
+        }
+    }
+
+    private static void closeQuietly(Closeable closeable) {
+        if (closeable == null) return;
+        try {
+            closeable.close();
+        } catch (IOException ex) {
+            // Ignore the exception on close.
+        }
+    }
+
+    @Override
+    @SuppressWarnings("GenericException") // super.finalize() throws Throwable
+    protected void finalize() throws Throwable {
+        try {
+            if (mGuard != null) {
+                mGuard.warnIfOpen();
+            }
+            if (mJsIsolateStub != null) {
+                close();
+            }
+        } finally {
+            super.finalize();
+        }
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsSandbox.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsSandbox.java
new file mode 100644
index 0000000..aa39a9d
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/JsSandbox.java
@@ -0,0 +1,434 @@
+/*
+ * 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.javascriptengine;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageInfo;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.webkit.WebView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.StringDef;
+import androidx.annotation.VisibleForTesting;
+import androidx.concurrent.futures.CallbackToFutureAdapter;
+import androidx.core.content.ContextCompat;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+import org.chromium.android_webview.js_sandbox.common.IJsSandboxIsolate;
+import org.chromium.android_webview.js_sandbox.common.IJsSandboxService;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.HashSet;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.annotation.concurrent.GuardedBy;
+
+/**
+ * Sandbox that provides APIs for JavaScript evaluation in a restricted environment.
+ *
+ * JsSandbox represents a connection to an isolated process. The isolated process is exclusive
+ * to the calling app (i.e. it doesn't share anything with, and can't be compromised by another
+ * app's isolated process).
+ * <p>
+ * Code that is run in a sandbox does not have any access to data
+ * belonging to the original app unless explicitly passed into it by using the methods of this
+ * class. This provides a security boundary between the calling app and the Javascript execution
+ * environment.
+ * <p>
+ * The calling app can only have only one isolated process at a time, so only one
+ * instance of this object can exist at a time.
+ * <p>
+ * It's safe to share a single {@link JsSandbox}
+ * object with multiple threads and use it from multiple threads at once.
+ * For example, {@link JsSandbox} can be stored at a global location and multiple threads can create
+ * their own {@link JsIsolate} objects from it but the {@link JsIsolate} object cannot be shared.
+ */
+public class JsSandbox implements AutoCloseable {
+    // TODO(crbug.com/1297672): Add capability to this class to support spawning
+    // different processes as needed. This might require that we have a static
+    // variable in here that tracks the existing services we are connected to and
+    // connect to a different one when creating a new object.
+    private static final String TAG = "JsSandbox";
+    private static final String JS_SANDBOX_SERVICE_NAME =
+            "org.chromium.android_webview.js_sandbox.service.JsSandboxService0";
+    static AtomicBoolean sIsReadyToConnect = new AtomicBoolean(true);
+    private final Object mLock = new Object();
+    private CloseGuardHelper mGuard = CloseGuardHelper.create();
+
+    @Nullable
+    @GuardedBy("mLock")
+    private IJsSandboxService mJsSandboxService;
+
+    private final ConnectionSetup mConnection;
+
+    @Nullable
+    @GuardedBy("mLock")
+    private HashSet<JsIsolate> mActiveIsolateSet = new HashSet<JsIsolate>();
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @StringDef(value =
+            {
+                    JS_FEATURE_ISOLATE_TERMINATION,
+                    JS_FEATURE_PROMISE_RETURN,
+                    JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER,
+                    JS_FEATURE_WASM_COMPILATION,
+            })
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.PARAMETER, ElementType.METHOD})
+    public @interface JsSandboxFeature {}
+
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     *
+     * When this
+     * feature is present, {@link JsIsolate#close()} terminates the currently running JS
+     * evaluation and close the isolate. If it is absent, {@link JsIsolate#close()} cannot terminate
+     * any running or queued evaluations in the background,
+     * so the isolate continues to consume resources until they complete.
+     * <p>
+     * Irrespective of this feature, calling {@link JsSandbox#close()} terminates all
+     * {@link JsIsolate} objects (and the isolated process) immediately and all pending
+     * {@link JsIsolate#evaluateJavaScriptAsync(String)} futures resolve with {@link
+     * IsolateTerminatedException}.
+     */
+    public static final String JS_FEATURE_ISOLATE_TERMINATION = "JS_FEATURE_ISOLATE_TERMINATION";
+
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     *
+     * When this feature is present, JS expressions may return promises. The Future returned by
+     * {@link JsIsolate#evaluateJavaScriptAsync(String)} resolves to the promise's result,
+     * once the promise resolves.
+     */
+    public static final String JS_FEATURE_PROMISE_RETURN = "JS_FEATURE_PROMISE_RETURN";
+
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     * When this feature is present, {@link JsIsolate#provideNamedData(String, byte[])} can be used.
+     * <p>
+     * This also covers the JS API android.consumeNamedDataAsArrayBuffer(string).
+     */
+    public static final String JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER =
+            "JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER";
+
+    /**
+     * Feature for {@link #isFeatureSupported(String)}.
+     *
+     * This features provides additional behavior to {@link
+     * JsIsolate#evaluateJavaScriptAsync(String)} ()}. When this feature is present, the JS API
+     * WebAssembly.compile(ArrayBuffer) can be used.
+     */
+    public static final String JS_FEATURE_WASM_COMPILATION = "JS_FEATURE_WASM_COMPILATION";
+
+    @Nullable
+    private HashSet<String> mClientSideFeatureSet;
+
+    static class ConnectionSetup implements ServiceConnection {
+        @Nullable
+        private CallbackToFutureAdapter.Completer<JsSandbox> mCompleter;
+        @Nullable
+        private JsSandbox mJsSandbox;
+        Context mContext;
+
+        @Override
+        @SuppressWarnings("NullAway")
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            IJsSandboxService jsSandboxService = IJsSandboxService.Stub.asInterface(service);
+            mJsSandbox = new JsSandbox(this, jsSandboxService);
+            mCompleter.set(mJsSandbox);
+            mCompleter = null;
+        }
+
+        // TODO(crbug.com/1297672): We may want an explicit way to signal to the client that the
+        // process crashed (like onRenderProcessGone in WebView), without them having to first call
+        // one of the methods and have it fail.
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            runShutdownTasks(
+                    new RuntimeException("JsSandbox internal error: onServiceDisconnected()"));
+        }
+
+        @Override
+        public void onBindingDied(ComponentName name) {
+            runShutdownTasks(new RuntimeException("JsSandbox internal error: onBindingDead()"));
+        }
+
+        @Override
+        public void onNullBinding(ComponentName name) {
+            runShutdownTasks(new RuntimeException("JsSandbox internal error: onNullBinding()"));
+        }
+
+        private void runShutdownTasks(Exception e) {
+            if (mJsSandbox != null) {
+                mJsSandbox.doClose(new SandboxDeadException());
+            } else {
+                mContext.unbindService(this);
+                sIsReadyToConnect.set(true);
+            }
+            if (mCompleter != null) {
+                mCompleter.setException(e);
+            }
+            mCompleter = null;
+        }
+
+        ConnectionSetup(Context context,
+                @NonNull CallbackToFutureAdapter.Completer<JsSandbox> completer) {
+            mContext = context;
+            mCompleter = completer;
+        }
+    }
+
+    /**
+     * Asynchronously create and connect to the sandbox process.
+     *
+     * Only one sandbox process can exist at a time. Attempting to create a new instance before
+     * the previous instance has been closed fails with an {@link IllegalStateException}.
+     *
+     * @param context When the context is destroyed, the connection is closed. Use an
+     *         application
+     *     context if the connection is expected to outlive a single activity or service.
+     *
+     * @return Future that evaluates to a connected {@link JsSandbox} instance or an exception if
+     *     binding to service fails.
+     */
+    @NonNull
+    public static ListenableFuture<JsSandbox> createConnectedInstanceAsync(
+            @NonNull Context context) {
+        PackageInfo systemWebViewPackage = WebView.getCurrentWebViewPackage();
+        ComponentName compName =
+                new ComponentName(systemWebViewPackage.packageName, JS_SANDBOX_SERVICE_NAME);
+        int flag = Context.BIND_AUTO_CREATE | Context.BIND_EXTERNAL_SERVICE;
+        return bindToServiceWithCallback(context, compName, flag);
+    }
+
+    /**
+     * Asynchronously create and connect to the sandbox process for testing.
+     *
+     * Only one sandbox process can exist at a time. Attempting to create a new instance before
+     * the previous instance has been closed will fail with an {@link IllegalStateException}.
+     *
+     * @param context When the context is destroyed, the connection will be closed. Use an
+     *         application
+     *     context if the connection is expected to outlive a single activity/service.
+     *
+     * @return Future that evaluates to a connected {@link JsSandbox} instance or an exception if
+     *     binding to service fails.
+     *
+     * @hide
+     */
+    @NonNull
+    @VisibleForTesting
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    public static ListenableFuture<JsSandbox> createConnectedInstanceForTestingAsync(
+            @NonNull Context context) {
+        ComponentName compName = new ComponentName(context, JS_SANDBOX_SERVICE_NAME);
+        int flag = Context.BIND_AUTO_CREATE;
+        return bindToServiceWithCallback(context, compName, flag);
+    }
+
+    @NonNull private static ListenableFuture<JsSandbox> bindToServiceWithCallback(
+            Context context, ComponentName compName, int flag) {
+        Intent intent = new Intent();
+        intent.setComponent(compName);
+        return CallbackToFutureAdapter.getFuture(completer -> {
+            ConnectionSetup connectionSetup = new ConnectionSetup(context, completer);
+            if (sIsReadyToConnect.compareAndSet(true, false)) {
+                try {
+                    boolean isBinding = context.bindService(intent, connectionSetup, flag);
+                    if (isBinding) {
+                        Executor mainExecutor;
+                        mainExecutor = ContextCompat.getMainExecutor(context);
+                        completer.addCancellationListener(
+                                () -> {
+                                    context.unbindService(connectionSetup);
+                                }, mainExecutor);
+                    } else {
+                        context.unbindService(connectionSetup);
+                        sIsReadyToConnect.set(true);
+                        completer.setException(
+                                new RuntimeException("bindService() returned false " + intent));
+                    }
+                } catch (SecurityException e) {
+                    context.unbindService(connectionSetup);
+                    sIsReadyToConnect.set(true);
+                    completer.setException(e);
+                }
+            } else {
+                completer.setException(
+                        new IllegalStateException("Binding to already bound service"));
+            }
+
+            // Debug string.
+            return "JsSandbox Future";
+        });
+    }
+
+    // We prevent direct initializations of this class. Use JsSandbox.createConnectedInstance().
+    JsSandbox(ConnectionSetup connectionSetup, IJsSandboxService jsSandboxService) {
+        mConnection = connectionSetup;
+        mJsSandboxService = jsSandboxService;
+        mGuard.open("close");
+        // This should be at the end of the constructor.
+    }
+
+    /**
+     * Creates and returns an {@link JsIsolate} within which JS can be executed.
+     */
+    @NonNull
+    @SuppressWarnings("NullAway")
+    public JsIsolate createIsolate() {
+        synchronized (mLock) {
+            if (mJsSandboxService == null) {
+                throw new IllegalStateException(
+                        "Attempting to createIsolate on a service that isn't connected");
+            }
+            try {
+                IJsSandboxIsolate isolateStub = mJsSandboxService.createIsolate();
+                JsIsolate isolate = new JsIsolate(isolateStub, this);
+                mActiveIsolateSet.add(isolate);
+                return isolate;
+            } catch (RemoteException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    @GuardedBy("mLock")
+    @SuppressWarnings("NullAway")
+    private void populateClientFeatureSet() {
+        List<String> features;
+        try {
+            features = mJsSandboxService.getSupportedFeatures();
+        } catch (RemoteException e) {
+            throw new RuntimeException(e);
+        }
+        mClientSideFeatureSet = new HashSet<String>();
+        if (features.contains(IJsSandboxService.ISOLATE_TERMINATION)) {
+            mClientSideFeatureSet.add(JS_FEATURE_ISOLATE_TERMINATION);
+        }
+        if (features.contains(IJsSandboxService.WASM_FROM_ARRAY_BUFFER)) {
+            mClientSideFeatureSet.add(JS_FEATURE_PROMISE_RETURN);
+            mClientSideFeatureSet.add(JS_FEATURE_PROVIDE_CONSUME_ARRAY_BUFFER);
+            mClientSideFeatureSet.add(JS_FEATURE_WASM_COMPILATION);
+        }
+    }
+
+    /**
+     * Checks whether a given feature is supported by the JS Sandbox implementation.
+     *
+     * The sandbox implementation is provided by the version of WebView installed on the device.
+     * The app must use this method to check which library features are supported by the device's
+     * implementation before using them.
+     * <p>
+     * A feature check should be made prior to depending on certain features.
+     *
+     * @param feature feature to be checked
+     *
+     * @return {@code true} if supported, {@code false} otherwise
+     */
+    @SuppressWarnings("NullAway")
+    public boolean isFeatureSupported(@NonNull @JsSandboxFeature String feature) {
+        synchronized (mLock) {
+            if (mJsSandboxService == null) {
+                throw new IllegalStateException(
+                        "Attempting to check features on a service that isn't connected");
+            }
+            if (mClientSideFeatureSet == null) {
+                populateClientFeatureSet();
+            }
+            return mClientSideFeatureSet.contains(feature);
+        }
+    }
+
+    void removeFromIsolateSet(JsIsolate isolate) {
+        synchronized (mLock) {
+            if (mActiveIsolateSet != null) {
+                mActiveIsolateSet.remove(isolate);
+            }
+        }
+    }
+
+    /**
+     * Closes the {@link JsSandbox} object and renders it unusable.
+     *
+     * The client is expected to call this method explicitly to terminate the isolated process.
+     * <p>
+     * Once closed, no more {@link JsSandbox} and {@link JsIsolate} method calls can be made.
+     * Closing terminates the isolated process immediately. All pending evaluations are
+     * immediately terminated. Once closed, the client may call {@link
+     * JsSandbox#createConnectedInstanceAsync(Context)} to create another {@link JsSandbox}.
+     */
+    @Override
+    public void close() {
+        doClose(new IsolateTerminatedException());
+    }
+
+    void doClose(Exception cancelPendingWith) {
+        synchronized (mLock) {
+            if (mJsSandboxService == null) {
+                return;
+            }
+            cancelPendingEvaluationsLocked(cancelPendingWith);
+            mConnection.mContext.unbindService(mConnection);
+            // Currently we consider that we are ready for a new connection once we unbind. This
+            // might not be true if the process is not immediately killed by ActivityManager once it
+            // is unbound.
+            sIsReadyToConnect.set(true);
+            mJsSandboxService = null;
+        }
+    }
+
+    @GuardedBy("mLock")
+    private void cancelPendingEvaluationsLocked(Exception e) {
+        for (JsIsolate ele : mActiveIsolateSet) {
+            ele.cancelAllPendingEvaluations(e);
+        }
+        mActiveIsolateSet = null;
+    }
+
+    @Override
+    @SuppressWarnings("GenericException") // super.finalize() throws Throwable
+    protected void finalize() throws Throwable {
+        try {
+            if (mGuard != null) {
+                mGuard.warnIfOpen();
+            }
+            synchronized (mLock) {
+                if (mJsSandboxService != null) {
+                    close();
+                }
+            }
+        } finally {
+            super.finalize();
+        }
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/SandboxDeadException.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/SandboxDeadException.java
new file mode 100644
index 0000000..3bed154
--- /dev/null
+++ b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/SandboxDeadException.java
@@ -0,0 +1,26 @@
+/*
+ * 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.javascriptengine;
+
+/**
+ * Exception thrown when evaluation is terminated due the {@link JsSandbox} being dead.
+ */
+public class SandboxDeadException extends JsException {
+    public SandboxDeadException() {
+        super();
+    }
+}
diff --git a/javascriptengine/javascriptengine/src/main/androidx/javascriptengine/package-info.java b/javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/package-info.java
similarity index 100%
rename from javascriptengine/javascriptengine/src/main/androidx/javascriptengine/package-info.java
rename to javascriptengine/javascriptengine/src/main/java/androidx/javascriptengine/package-info.java
diff --git a/libraryversions.toml b/libraryversions.toml
index f576ee3..9f93ced 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -3,7 +3,7 @@
 ADS_IDENTIFIER = "1.0.0-alpha05"
 ANNOTATION = "1.5.0-alpha02"
 ANNOTATION_EXPERIMENTAL = "1.3.0-beta01"
-APPCOMPAT = "1.6.0-alpha06"
+APPCOMPAT = "1.6.0-beta01"
 APPSEARCH = "1.1.0-alpha01"
 ARCH_CORE = "2.2.0-alpha01"
 ASYNCLAYOUTINFLATER = "1.1.0-alpha01"
@@ -19,7 +19,7 @@
 CAR_APP = "1.3.0-alpha02"
 COLLECTION = "1.3.0-alpha03"
 COMPOSE = "1.3.0-alpha03"
-COMPOSE_COMPILER = "1.3.0-rc01"
+COMPOSE_COMPILER = "1.3.0-rc02"
 COMPOSE_MATERIAL3 = "1.0.0-alpha16"
 COMPOSE_RUNTIME_TRACING = "1.0.0-alpha01"
 CONTENTPAGER = "1.1.0-alpha01"
@@ -83,6 +83,7 @@
 PERCENTLAYOUT = "1.1.0-alpha01"
 PREFERENCE = "1.3.0-alpha01"
 PRINT = "1.1.0-beta01"
+PRIVACYSANDBOX_TOOLS = "1.0.0-alpha01"
 PROFILEINSTALLER = "1.3.0-alpha01"
 RECOMMENDATION = "1.1.0-alpha01"
 RECYCLERVIEW = "1.3.0-beta02"
@@ -128,7 +129,7 @@
 WEAR_ONGOING = "1.1.0-alpha01"
 WEAR_PHONE_INTERACTIONS = "1.1.0-alpha04"
 WEAR_REMOTE_INTERACTIONS = "1.1.0-alpha01"
-WEAR_TILES = "1.1.0-beta02"
+WEAR_TILES = "1.1.0-rc01"
 WEAR_WATCHFACE = "1.2.0-alpha01"
 WEBKIT = "1.6.0-alpha01"
 WINDOW = "1.1.0-alpha04"
@@ -205,6 +206,7 @@
 PERCENTLAYOUT = { group = "androidx.percentlayout", atomicGroupVersion = "versions.PERCENTLAYOUT" }
 PREFERENCE = { group = "androidx.preference", atomicGroupVersion = "versions.PREFERENCE" }
 PRINT = { group = "androidx.print", atomicGroupVersion = "versions.PRINT" }
+PRIVACYSANDBOX_TOOLS = { group = "androidx.privacysandbox.tools", atomicGroupVersion = "versions.PRIVACYSANDBOX_TOOLS" }
 PROFILEINSTALLER = { group = "androidx.profileinstaller", atomicGroupVersion = "versions.PROFILEINSTALLER" }
 RECOMMENDATION = { group = "androidx.recommendation", atomicGroupVersion = "versions.RECOMMENDATION" }
 RECYCLERVIEW = { group = "androidx.recyclerview" }
diff --git a/lifecycle/integration-tests/testapp/lint-baseline.xml b/lifecycle/integration-tests/testapp/lint-baseline.xml
index 34db726..927c56e 100644
--- a/lifecycle/integration-tests/testapp/lint-baseline.xml
+++ b/lifecycle/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt b/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
index 3a50f64..9469d07 100644
--- a/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
@@ -41,11 +41,8 @@
                 AndroidManifestServiceExportedDetector.ISSUE,
                 BanParcelableUsage.ISSUE,
                 BanConcurrentHashMap.ISSUE,
-
-                // Reenable after b/235251897 is resolved
-//                BanInappropriateExperimentalUsage.ISSUE,
-//                BanInappropriateExperimentalUsage.NULL_ANNOTATION_GROUP_ISSUE,
-
+                BanInappropriateExperimentalUsage.ISSUE,
+                BanInappropriateExperimentalUsage.NULL_ANNOTATION_GROUP_ISSUE,
                 BanInlineOptIn.ISSUE,
                 BanKeepAnnotation.ISSUE,
                 TargetApiAnnotationUsageDetector.ISSUE,
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt b/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
index bc2a5b6..e29f6e2 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
@@ -356,13 +356,11 @@
          *         path, or `null` if [jarFilePath] doesn't contain the string "androidx".
          */
         internal fun getMavenCoordinatesFromPath(jarFilePath: String): LintModelMavenName? {
-            if (!jarFilePath.contains("androidx")) return null
-
             val pathParts = jarFilePath.split("/")
-
             val androidxIndex = pathParts.indexOf("androidx")
-            val groupId = pathParts[androidxIndex] + "." + pathParts[androidxIndex + 1]
+            if (androidxIndex == -1) return null
 
+            val groupId = pathParts[androidxIndex] + "." + pathParts[androidxIndex + 1]
             val artifactId = pathParts[androidxIndex + 2]
 
             val filename = pathParts.last()
diff --git a/media/media/lint-baseline.xml b/media/media/lint-baseline.xml
index 3db7c43f..35e2796e 100644
--- a/media/media/lint-baseline.xml
+++ b/media/media/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-beta02" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-beta02)" variant="all" version="7.1.0-beta02">
+<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="LambdaLast"
@@ -12,7 +12,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public AudioAttributesImpl mImpl;"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder(AudioAttributesCompat aa) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -30,7 +30,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public AudioAttributesCompat build() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -39,7 +39,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setUsage(@AttributeUsage int usage) {"
         errorLine2="               ~~~~~~~">
         <location
@@ -48,7 +48,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setContentType(@AttributeContentType int contentType) {"
         errorLine2="               ~~~~~~~">
         <location
@@ -57,7 +57,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setFlags(int flags) {"
         errorLine2="               ~~~~~~~">
         <location
@@ -66,7 +66,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setLegacyStreamType(int streamType) {"
         errorLine2="               ~~~~~~~">
         <location
@@ -75,7 +75,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public AudioAttributes mAudioAttributes;"
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
@@ -84,7 +84,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public AudioFocusRequestCompat build() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -93,7 +93,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaBrowserCompat(Context context, ComponentName serviceComponent,"
         errorLine2="                              ~~~~~~~">
         <location
@@ -102,7 +102,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaBrowserCompat(Context context, ComponentName serviceComponent,"
         errorLine2="                                               ~~~~~~~~~~~~~">
         <location
@@ -111,7 +111,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            ConnectionCallback callback, Bundle rootHints) {"
         errorLine2="            ~~~~~~~~~~~~~~~~~~">
         <location
@@ -120,7 +120,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            ConnectionCallback callback, Bundle rootHints) {"
         errorLine2="                                         ~~~~~~">
         <location
@@ -129,7 +129,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 search(@NonNull final String query, final Bundle extras,"
         errorLine2="                                                          ~~~~~~">
         <location
@@ -138,7 +138,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 sendCustomAction(@NonNull String action, Bundle extras,"
         errorLine2="                                                         ~~~~~~">
         <location
@@ -147,7 +147,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaItem fromMediaItem(Object itemObj) {"
         errorLine2="                      ~~~~~~~~~">
         <location
@@ -156,7 +156,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaItem fromMediaItem(Object itemObj) {"
         errorLine2="                                              ~~~~~~">
         <location
@@ -165,7 +165,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 List&lt;MediaItem> fromMediaItemList(List&lt;?> itemList) {"
         errorLine2="                      ~~~~~~~~~~~~~~~">
         <location
@@ -174,7 +174,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 List&lt;MediaItem> fromMediaItemList(List&lt;?> itemList) {"
         errorLine2="                                                        ~~~~~~~">
         <location
@@ -183,7 +183,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel out, int flags) {"
         errorLine2="                                  ~~~~~~">
         <location
@@ -192,7 +192,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onItemLoaded(MediaItem item) {"
         errorLine2="                                 ~~~~~~~~~">
         <location
@@ -201,7 +201,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSearchResult(@NonNull String query, Bundle extras,"
         errorLine2="                                                          ~~~~~~">
         <location
@@ -210,7 +210,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onError(@NonNull String query, Bundle extras) {"
         errorLine2="                                                   ~~~~~~">
         <location
@@ -219,7 +219,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onProgressUpdate(String action, Bundle extras, Bundle data) {"
         errorLine2="                                     ~~~~~~">
         <location
@@ -228,7 +228,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onProgressUpdate(String action, Bundle extras, Bundle data) {"
         errorLine2="                                                    ~~~~~~">
         <location
@@ -237,3049 +237,2423 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onProgressUpdate(String action, Bundle extras, Bundle data) {"
         errorLine2="                                                                   ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"
-            line="962"
-            column="68"/>
+            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onResult(String action, Bundle extras, Bundle resultData) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"
-            line="972"
-            column="30"/>
+            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onResult(String action, Bundle extras, Bundle resultData) {"
         errorLine2="                                            ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"
-            line="972"
-            column="45"/>
+            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onResult(String action, Bundle extras, Bundle resultData) {"
         errorLine2="                                                           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"
-            line="972"
-            column="60"/>
+            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onError(String action, Bundle extras, Bundle data) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"
-            line="983"
-            column="29"/>
+            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onError(String action, Bundle extras, Bundle data) {"
         errorLine2="                                           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"
-            line="983"
-            column="44"/>
+            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onError(String action, Bundle extras, Bundle data) {"
         errorLine2="                                                          ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"
-            line="983"
-            column="59"/>
+            file="src/main/java/android/support/v4/media/MediaBrowserCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 boolean areSameOptions(Bundle options1, Bundle options2) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"
-            line="31"
-            column="42"/>
+            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 boolean areSameOptions(Bundle options1, Bundle options2) {"
         errorLine2="                                                          ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"
-            line="31"
-            column="59"/>
+            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 boolean hasDuplicatedItems(Bundle options1, Bundle options2) {"
         errorLine2="                                             ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"
-            line="48"
-            column="46"/>
+            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 boolean hasDuplicatedItems(Bundle options1, Bundle options2) {"
         errorLine2="                                                              ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"
-            line="48"
-            column="63"/>
+            file="src/main/java/androidx/media/MediaBrowserCompatUtils.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 attachToBaseContext(Context base) {"
         errorLine2="                                    ~~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1311"
-            column="37"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public IBinder onBind(Intent intent) {"
         errorLine2="           ~~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1333"
-            column="12"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public IBinder onBind(Intent intent) {"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1333"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {"
-        errorLine2="                     ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1338"
-            column="22"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {"
-        errorLine2="                                        ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1338"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {"
-        errorLine2="                                                            ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1338"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSubscribe(String id, Bundle option) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1429"
-            column="29"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSubscribe(String id, Bundle option) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1429"
-            column="40"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onUnsubscribe(String id) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1439"
-            column="31"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onLoadItem(String itemId, @NonNull Result&lt;MediaBrowserCompat.MediaItem> result) {"
         errorLine2="                           ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1460"
-            column="28"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSearch(@NonNull String query, Bundle extras,"
         errorLine2="                                                ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1486"
-            column="49"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCustomAction(@NonNull String action, Bundle extras,"
         errorLine2="                                                       ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1511"
-            column="56"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setSessionToken(MediaSessionCompat.Token token) {"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1524"
-            column="33"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public final Bundle getBrowserRootHints() {"
         errorLine2="                 ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1559"
-            column="18"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public String getRootId() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1967"
-            column="16"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Bundle getExtras() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"
-            line="1974"
-            column="16"/>
+            file="src/main/java/androidx/media/MediaBrowserServiceCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onReceive(Context context, Intent intent) {"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="105"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onReceive(Context context, Intent intent) {"
-        errorLine2="                                           ~~~~~~">
-        <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="105"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 KeyEvent handleIntent(MediaSessionCompat mediaSessionCompat, Intent intent) {"
         errorLine2="                  ~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="190"
-            column="19"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 KeyEvent handleIntent(MediaSessionCompat mediaSessionCompat, Intent intent) {"
         errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="190"
-            column="41"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 KeyEvent handleIntent(MediaSessionCompat mediaSessionCompat, Intent intent) {"
         errorLine2="                                                                               ~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="190"
-            column="80"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PendingIntent buildMediaButtonPendingIntent(Context context,"
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="223"
-            column="19"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PendingIntent buildMediaButtonPendingIntent(Context context,"
         errorLine2="                                                              ~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="223"
-            column="63"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PendingIntent buildMediaButtonPendingIntent(Context context,"
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="256"
-            column="19"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PendingIntent buildMediaButtonPendingIntent(Context context,"
         errorLine2="                                                              ~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="256"
-            column="63"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            ComponentName mbrComponent, @MediaKeyAction long action) {"
         errorLine2="            ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="257"
-            column="13"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 ComponentName getMediaButtonReceiverComponent(Context context) {"
         errorLine2="                  ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="282"
-            column="19"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 ComponentName getMediaButtonReceiverComponent(Context context) {"
         errorLine2="                                                                ~~~~~~~">
         <location
-            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"
-            line="282"
-            column="65"/>
+            file="src/main/java/androidx/media/session/MediaButtonReceiver.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            MediaControllerCompat mediaController) {"
         errorLine2="            ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="162"
-            column="13"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaControllerCompat getMediaController(@NonNull Activity activity) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="181"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaControllerCompat(Context context, @NonNull MediaSessionCompat session) {"
         errorLine2="                                 ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="224"
-            column="34"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaControllerCompat(Context context, @NonNull MediaSessionCompat.Token sessionToken) {"
         errorLine2="                                 ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="245"
-            column="34"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public TransportControls getTransportControls() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="263"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean dispatchMediaButtonEvent(KeyEvent keyEvent) {"
         errorLine2="                                            ~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="274"
-            column="45"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PlaybackStateCompat getPlaybackState() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="291"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaMetadataCompat getMetadata() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="300"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public List&lt;QueueItem> getQueue() {"
         errorLine2="           ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="310"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 addQueueItem(MediaDescriptionCompat description) {"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="326"
-            column="30"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 addQueueItem(MediaDescriptionCompat description, int index) {"
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="346"
-            column="30"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 removeQueueItem(MediaDescriptionCompat description) {"
         errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="363"
-            column="33"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CharSequence getQueueTitle() {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="393"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Bundle getExtras() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="400"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PlaybackInfo getPlaybackInfo() {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="480"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PendingIntent getSessionActivity() {"
         errorLine2="           ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="490"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaSessionCompat.Token getSessionToken() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="499"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 registerCallback(@NonNull Callback callback, Handler handler) {"
         errorLine2="                                                             ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="567"
-            column="62"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getPackageName() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="645"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getMediaController() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="675"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSessionEvent(String event, Bundle extras) {"
         errorLine2="                                   ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="720"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSessionEvent(String event, Bundle extras) {"
         errorLine2="                                                 ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="720"
-            column="50"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPlaybackStateChanged(PlaybackStateCompat state) {"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="728"
-            column="44"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onMetadataChanged(MediaMetadataCompat metadata) {"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="737"
-            column="39"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onQueueChanged(List&lt;QueueItem> queue) {"
         errorLine2="                                   ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="748"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onQueueTitleChanged(CharSequence title) {"
         errorLine2="                                        ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="758"
-            column="41"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onExtrasChanged(Bundle extras) {"
         errorLine2="                                    ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="767"
-            column="37"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onAudioInfoChanged(PlaybackInfo info) {"
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="775"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public IMediaControllerCallback getIControllerCallback() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="814"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void prepareFromMediaId(String mediaId, Bundle extras);"
         errorLine2="                                                ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1165"
-            column="49"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void prepareFromMediaId(String mediaId, Bundle extras);"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1165"
-            column="65"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void prepareFromSearch(String query, Bundle extras);"
         errorLine2="                                               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1177"
-            column="48"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void prepareFromSearch(String query, Bundle extras);"
         errorLine2="                                                             ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1177"
-            column="62"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void prepareFromUri(Uri uri, Bundle extras);"
         errorLine2="                                            ~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1188"
-            column="45"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void prepareFromUri(Uri uri, Bundle extras);"
         errorLine2="                                                     ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1188"
-            column="54"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void playFromMediaId(String mediaId, Bundle extras);"
         errorLine2="                                             ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1202"
-            column="46"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void playFromMediaId(String mediaId, Bundle extras);"
         errorLine2="                                                             ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1202"
-            column="62"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void playFromSearch(String query, Bundle extras);"
         errorLine2="                                            ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1213"
-            column="45"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void playFromSearch(String query, Bundle extras);"
         errorLine2="                                                          ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1213"
-            column="59"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void playFromUri(Uri uri, Bundle extras);"
         errorLine2="                                         ~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1222"
-            column="42"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void playFromUri(Uri uri, Bundle extras);"
         errorLine2="                                                  ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1222"
-            column="51"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void setRating(RatingCompat rating);"
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1278"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void setRating(RatingCompat rating, Bundle extras);"
         errorLine2="                                       ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1292"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void setRating(RatingCompat rating, Bundle extras);"
         errorLine2="                                                            ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1292"
-            column="61"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void sendCustomAction(PlaybackStateCompat.CustomAction customAction,"
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1338"
-            column="47"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                Bundle args);"
         errorLine2="                ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1339"
-            column="17"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void sendCustomAction(String action, Bundle args);"
         errorLine2="                                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1357"
-            column="47"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void sendCustomAction(String action, Bundle args);"
         errorLine2="                                                             ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"
-            line="1357"
-            column="62"/>
+            file="src/main/java/android/support/v4/media/session/MediaControllerCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="306"
-            column="31"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getMediaDescription() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="337"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaDescriptionCompat fromMediaDescription(Object descriptionObj) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="385"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaDescriptionCompat fromMediaDescription(Object descriptionObj) {"
         errorLine2="                                                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="385"
-            column="63"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setMediaId(@Nullable String mediaId) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="474"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setTitle(@Nullable CharSequence title) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="485"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setSubtitle(@Nullable CharSequence subtitle) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="496"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setDescription(@Nullable CharSequence description) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="508"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setIconBitmap(@Nullable Bitmap icon) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="520"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setIconUri(@Nullable Uri iconUri) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="532"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setExtras(@Nullable Bundle extras) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="543"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setMediaUri(@Nullable Uri mediaUri) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="554"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaDescriptionCompat build() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"
-            line="565"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaDescriptionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean containsKey(String key) {"
         errorLine2="                               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="374"
-            column="32"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CharSequence getText(@TextKey String key) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="386"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CharSequence getText(@TextKey String key) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="386"
-            column="42"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getString(@TextKey String key) {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="398"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getString(@TextKey String key) {"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="398"
-            column="38"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public long getLong(@LongKey String key) {"
         errorLine2="                                 ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="413"
-            column="34"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public RatingCompat getRating(@RatingKey String key) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="424"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public RatingCompat getRating(@RatingKey String key) {"
         errorLine2="                                             ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="424"
-            column="46"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Bitmap getBitmap(@BitmapKey String key) {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="448"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Bitmap getBitmap(@BitmapKey String key) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="448"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaDescriptionCompat getDescription() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="464"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="552"
-            column="31"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Set&lt;String> keySet() {"
         errorLine2="           ~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="570"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Bundle getBundle() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="580"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaMetadataCompat fromMediaMetadata(Object metadataObj) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="597"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaMetadataCompat fromMediaMetadata(Object metadataObj) {"
         errorLine2="                                                        ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="597"
-            column="57"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getMediaMetadata() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="621"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder(MediaMetadataCompat source) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="667"
-            column="24"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder(MediaMetadataCompat source, int maxBitmapSize) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="683"
-            column="24"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putText(@TextKey String key, CharSequence value) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="722"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putText(@TextKey String key, CharSequence value) {"
         errorLine2="                                        ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="722"
-            column="41"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putText(@TextKey String key, CharSequence value) {"
         errorLine2="                                                    ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="722"
-            column="53"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putString(@TextKey String key, String value) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="759"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putString(@TextKey String key, String value) {"
         errorLine2="                                          ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="759"
-            column="43"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putString(@TextKey String key, String value) {"
         errorLine2="                                                      ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="759"
-            column="55"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putLong(@LongKey String key, long value) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="789"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putLong(@LongKey String key, long value) {"
         errorLine2="                                        ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="789"
-            column="41"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putRating(@RatingKey String key, RatingCompat value) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="813"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putRating(@RatingKey String key, RatingCompat value) {"
         errorLine2="                                            ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="813"
-            column="45"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putRating(@RatingKey String key, RatingCompat value) {"
         errorLine2="                                                        ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="813"
-            column="57"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putBitmap(@BitmapKey String key, Bitmap value) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="848"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putBitmap(@BitmapKey String key, Bitmap value) {"
         errorLine2="                                            ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="848"
-            column="45"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder putBitmap(@BitmapKey String key, Bitmap value) {"
         errorLine2="                                                        ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="848"
-            column="57"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaMetadataCompat build() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"
-            line="864"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/MediaMetadataCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setCallback(Callback callback) {"
         errorLine2="                            ~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="613"
-            column="29"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setCallback(Callback callback, Handler handler) {"
         errorLine2="                            ~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="629"
-            column="29"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setCallback(Callback callback, Handler handler) {"
         errorLine2="                                               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="629"
-            column="48"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setSessionActivity(PendingIntent pi) {"
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="658"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setMediaButtonReceiver(PendingIntent mbr) {"
         errorLine2="                                       ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="675"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setPlaybackToRemote(VolumeProviderCompat volumeProvider) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="717"
-            column="37"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 sendSessionEvent(String event, Bundle extras) {"
         errorLine2="                                 ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="761"
-            column="34"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 sendSessionEvent(String event, Bundle extras) {"
         errorLine2="                                               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="761"
-            column="48"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Token getSessionToken() {"
         errorLine2="           ~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="791"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaControllerCompat getController() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="801"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setPlaybackState(PlaybackStateCompat state) {"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="810"
-            column="34"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setMetadata(MediaMetadataCompat metadata) {"
         errorLine2="                            ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="822"
-            column="29"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setQueue(List&lt;QueueItem> queue) {"
         errorLine2="                         ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="838"
-            column="26"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setQueueTitle(CharSequence title) {"
         errorLine2="                              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="862"
-            column="31"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setExtras(Bundle extras) {"
         errorLine2="                          ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="931"
-            column="27"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getMediaSession() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="945"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getRemoteControlClient() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="959"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getCallingPackage() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="995"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 addOnActiveChangeListener(OnActiveChangeListener listener) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1006"
-            column="43"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 removeOnActiveChangeListener(OnActiveChangeListener listener) {"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1019"
-            column="46"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaSessionCompat fromMediaSession(Context context, Object mediaSession) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1042"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaSessionCompat fromMediaSession(Context context, Object mediaSession) {"
         errorLine2="                                                      ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1042"
-            column="55"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaSessionCompat fromMediaSession(Context context, Object mediaSession) {"
         errorLine2="                                                                       ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1042"
-            column="72"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCommand(String command, Bundle extras, ResultReceiver cb) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1175"
-            column="31"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCommand(String command, Bundle extras, ResultReceiver cb) {"
         errorLine2="                                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1175"
-            column="47"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCommand(String command, Bundle extras, ResultReceiver cb) {"
         errorLine2="                                                             ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1175"
-            column="62"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {"
         errorLine2="                                          ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1189"
-            column="43"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPrepareFromMediaId(String mediaId, Bundle extras) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1282"
-            column="42"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPrepareFromMediaId(String mediaId, Bundle extras) {"
         errorLine2="                                                         ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1282"
-            column="58"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPrepareFromSearch(String query, Bundle extras) {"
         errorLine2="                                        ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1292"
-            column="41"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPrepareFromSearch(String query, Bundle extras) {"
         errorLine2="                                                      ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1292"
-            column="55"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPrepareFromUri(Uri uri, Bundle extras) {"
         errorLine2="                                     ~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1300"
-            column="38"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPrepareFromUri(Uri uri, Bundle extras) {"
         errorLine2="                                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1300"
-            column="47"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPlayFromMediaId(String mediaId, Bundle extras) {"
         errorLine2="                                      ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1313"
-            column="39"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPlayFromMediaId(String mediaId, Bundle extras) {"
         errorLine2="                                                      ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1313"
-            column="55"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPlayFromSearch(String query, Bundle extras) {"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1322"
-            column="38"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPlayFromSearch(String query, Bundle extras) {"
         errorLine2="                                                   ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1322"
-            column="52"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPlayFromUri(Uri uri, Bundle extras) {"
         errorLine2="                                  ~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1328"
-            column="35"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onPlayFromUri(Uri uri, Bundle extras) {"
         errorLine2="                                           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1328"
-            column="44"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSetRating(RatingCompat rating) {"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1387"
-            column="33"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSetRating(RatingCompat rating, Bundle extras) {"
         errorLine2="                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1396"
-            column="33"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSetRating(RatingCompat rating, Bundle extras) {"
         errorLine2="                                                     ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1396"
-            column="54"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCustomAction(String action, Bundle extras) {"
         errorLine2="                                   ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1467"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCustomAction(String action, Bundle extras) {"
         errorLine2="                                                  ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1467"
-            column="51"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onAddQueueItem(MediaDescriptionCompat description) {"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1477"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onAddQueueItem(MediaDescriptionCompat description, int index) {"
         errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1489"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onRemoveQueueItem(MediaDescriptionCompat description) {"
         errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1500"
-            column="39"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Token fromToken(Object token) {"
         errorLine2="                      ~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1984"
-            column="23"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Token fromToken(Object token) {"
         errorLine2="                                      ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="1984"
-            column="39"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Token fromToken(Object token, IMediaSession extraBinder) {"
         errorLine2="                      ~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2002"
-            column="23"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Token fromToken(Object token, IMediaSession extraBinder) {"
         errorLine2="                                      ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2002"
-            column="39"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Token fromToken(Object token, IMediaSession extraBinder) {"
         errorLine2="                                                    ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2002"
-            column="53"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2019"
-            column="35"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Object getToken() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2063"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public IMediaSession getExtraBinder() {"
         errorLine2="               ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2071"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setExtraBinder(IMediaSession extraBinder) {"
         errorLine2="                                   ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2081"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public VersionedParcelable getSession2Token() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2091"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setSession2Token(VersionedParcelable session2Token) {"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2101"
-            column="38"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Bundle toBundle() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2111"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Token fromBundle(Bundle tokenBundle) {"
         errorLine2="                      ~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2133"
-            column="23"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Token fromBundle(Bundle tokenBundle) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2133"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public QueueItem(MediaDescriptionCompat description, long id) {"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2189"
-            column="26"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaDescriptionCompat getDescription() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2216"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2228"
-            column="35"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Object getQueueItem() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2248"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 QueueItem fromQueueItem(Object queueItem) {"
         errorLine2="                      ~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2268"
-            column="23"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 QueueItem fromQueueItem(Object queueItem) {"
         errorLine2="                                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2268"
-            column="47"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 List&lt;QueueItem> fromQueueItemList(List&lt;?> itemList) {"
         errorLine2="                      ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2290"
-            column="23"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 List&lt;QueueItem> fromQueueItemList(List&lt;?> itemList) {"
         errorLine2="                                                        ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"
-            line="2290"
-            column="57"/>
+            file="src/main/java/android/support/v4/media/session/MediaSessionCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                android.media.session.MediaSessionManager.RemoteUserInfo remoteUserInfo) {"
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/MediaSessionManager.java"
-            line="184"
-            column="17"/>
+            file="src/main/java/androidx/media/MediaSessionManager.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaSessionCompat.Token getMediaSession(Notification notification) {"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="102"
-            column="23"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 MediaSessionCompat.Token getMediaSession(Notification notification) {"
         errorLine2="                                                               ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="102"
-            column="64"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle(androidx.core.app.NotificationCompat.Builder builder) {"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="139"
-            column="27"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle setShowActionsInCompactView(int...actions) {"
         errorLine2="               ~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="149"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle setShowActionsInCompactView(int...actions) {"
         errorLine2="                                                      ~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="149"
-            column="55"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle setMediaSession(MediaSessionCompat.Token token) {"
         errorLine2="               ~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="158"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle setMediaSession(MediaSessionCompat.Token token) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="158"
-            column="43"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle setShowCancelButton(boolean show) {"
         errorLine2="               ~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="187"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle setCancelButtonIntent(PendingIntent pendingIntent) {"
         errorLine2="               ~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="200"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MediaStyle setCancelButtonIntent(PendingIntent pendingIntent) {"
         errorLine2="                                                ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="200"
-            column="49"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 apply(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="210"
-            column="27"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="               ~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="225"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="225"
-            column="44"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="               ~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="293"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="293"
-            column="47"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 apply(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="378"
-            column="27"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="               ~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="393"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="393"
-            column="44"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="               ~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="435"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="435"
-            column="47"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="               ~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="467"
-            column="16"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
         errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/app/NotificationCompat.java"
-            line="467"
-            column="51"/>
+            file="src/main/java/androidx/media/app/NotificationCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ParcelableVolumeInfo(Parcel from) {"
         errorLine2="                                ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java"
-            line="44"
-            column="33"/>
+            file="src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java"
-            line="58"
-            column="31"/>
+            file="src/main/java/android/support/v4/media/session/ParcelableVolumeInfo.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="618"
-            column="31"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public long getCurrentPosition(Long timeDiff) {"
         errorLine2="                                   ~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="679"
-            column="36"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public List&lt;PlaybackStateCompat.CustomAction> getCustomActions() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="741"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CharSequence getErrorMessage() {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="774"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PlaybackStateCompat fromPlaybackState(Object stateObj) {"
         errorLine2="                  ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="808"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PlaybackStateCompat fromPlaybackState(Object stateObj) {"
         errorLine2="                                                        ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="808"
-            column="57"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getPlaybackState() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="854"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="918"
-            column="35"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PlaybackStateCompat.CustomAction fromCustomAction(Object customActionObj) {"
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="941"
-            column="23"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 PlaybackStateCompat.CustomAction fromCustomAction(Object customActionObj) {"
         errorLine2="                                                                        ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="941"
-            column="73"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Object getCustomAction() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="970"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public String getAction() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1000"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public CharSequence getName() {"
         errorLine2="               ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1009"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Bundle getExtras() {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1032"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            public Builder(String action, CharSequence name, int icon) {"
         errorLine2="                           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1066"
-            column="28"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            public Builder(String action, CharSequence name, int icon) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1066"
-            column="43"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            public Builder setExtras(Bundle extras) {"
         errorLine2="                   ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1093"
-            column="20"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            public Builder setExtras(Bundle extras) {"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1093"
-            column="38"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            public CustomAction build() {"
         errorLine2="                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1104"
-            column="20"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder(PlaybackStateCompat source) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1139"
-            column="24"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setState(@State int state, long position, float playbackSpeed) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1186"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setState(@State int state, long position, float playbackSpeed,"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1224"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setBufferedPosition(long bufferPosition) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1240"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setActions(@Actions long capabilities) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1275"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder addCustomAction(String action, String name, int icon) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1300"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder addCustomAction(String action, String name, int icon) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1300"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder addCustomAction(String action, String name, int icon) {"
         errorLine2="                                                      ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1300"
-            column="55"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder addCustomAction(PlaybackStateCompat.CustomAction customAction) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1315"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder addCustomAction(PlaybackStateCompat.CustomAction customAction) {"
         errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1315"
-            column="40"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setActiveQueueItemId(long id) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1331"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Builder setErrorMessage(CharSequence errorMessage) {"
-        errorLine2="               ~~~~~~~">
-        <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1344"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Builder setErrorMessage(CharSequence errorMessage) {"
-        errorLine2="                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1344"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setErrorMessage(@ErrorCode int errorCode, CharSequence errorMessage) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1357"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setErrorMessage(@ErrorCode int errorCode, CharSequence errorMessage) {"
         errorLine2="                                                                 ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1357"
-            column="66"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setExtras(Bundle extras) {"
         errorLine2="               ~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1369"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Builder setExtras(Bundle extras) {"
         errorLine2="                                 ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1369"
-            column="34"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public PlaybackStateCompat build() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"
-            line="1377"
-            column="16"/>
+            file="src/main/java/android/support/v4/media/session/PlaybackStateCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="128"
-            column="31"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 RatingCompat newUnratedRating(@Style int ratingStyle) {"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="160"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 RatingCompat newHeartRating(boolean hasHeart) {"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="181"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 RatingCompat newThumbRating(boolean thumbIsUp) {"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="192"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 RatingCompat newStarRating(@StarStyle int starRatingStyle,"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="208"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 RatingCompat newPercentageRating(float percent) {"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="239"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 RatingCompat fromRating(Object ratingObj) {"
         errorLine2="                  ~~~~~~~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="334"
-            column="19"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 RatingCompat fromRating(Object ratingObj) {"
         errorLine2="                                          ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="334"
-            column="43"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getRating() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/android/support/v4/media/RatingCompat.java"
-            line="377"
-            column="12"/>
+            file="src/main/java/android/support/v4/media/RatingCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setCallback(Callback callback) {"
         errorLine2="                            ~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/VolumeProviderCompat.java"
-            line="190"
-            column="29"/>
+            file="src/main/java/androidx/media/VolumeProviderCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Object getVolumeProvider() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/androidx/media/VolumeProviderCompat.java"
-            line="202"
-            column="12"/>
+            file="src/main/java/androidx/media/VolumeProviderCompat.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void onVolumeChanged(VolumeProviderCompat volumeProvider);"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media/VolumeProviderCompat.java"
-            line="238"
-            column="46"/>
+            file="src/main/java/androidx/media/VolumeProviderCompat.java"/>
     </issue>
 
 </issues>
diff --git a/media/version-compat-tests/current/service/lint-baseline.xml b/media/version-compat-tests/current/service/lint-baseline.xml
index 48673c2..8b68ffd 100644
--- a/media/version-compat-tests/current/service/lint-baseline.xml
+++ b/media/version-compat-tests/current/service/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/media/version-compat-tests/lib/lint-baseline.xml b/media/version-compat-tests/lib/lint-baseline.xml
index 0a1ee53..3dcdf00 100644
--- a/media/version-compat-tests/lib/lint-baseline.xml
+++ b/media/version-compat-tests/lib/lint-baseline.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-beta02" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-beta02)" variant="all" version="7.1.0-beta02">
+<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://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
@@ -12,7 +12,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void callMediaBrowserServiceMethod(int methodId, Object arg, Context context) {"
         errorLine2="                                                                   ~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void callMediaBrowserServiceMethod(int methodId, Object arg, Context context) {"
         errorLine2="                                                                               ~~~~~~~">
         <location
@@ -30,7 +30,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void callMediaSessionMethod(int methodId, Object arg, Context context) {"
         errorLine2="                                                            ~~~~~~">
         <location
@@ -39,7 +39,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void callMediaSessionMethod(int methodId, Object arg, Context context) {"
         errorLine2="                                                                        ~~~~~~~">
         <location
@@ -48,7 +48,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            int methodId, Object arg, Context context, Parcelable token) {"
         errorLine2="                          ~~~~~~">
         <location
@@ -57,7 +57,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            int methodId, Object arg, Context context, Parcelable token) {"
         errorLine2="                                      ~~~~~~~">
         <location
@@ -66,7 +66,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            int methodId, Object arg, Context context, Parcelable token) {"
         errorLine2="                                                       ~~~~~~~~~~">
         <location
@@ -75,7 +75,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            int methodId, Object arg, Context context, Parcelable token) {"
         errorLine2="                          ~~~~~~">
         <location
@@ -84,7 +84,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            int methodId, Object arg, Context context, Parcelable token) {"
         errorLine2="                                      ~~~~~~~">
         <location
@@ -93,7 +93,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            int methodId, Object arg, Context context, Parcelable token) {"
         errorLine2="                                                       ~~~~~~~~~~">
         <location
@@ -102,7 +102,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void waitFor(final PollingCheckCondition condition) {"
         errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -111,7 +111,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void waitFor(long timeout, final PollingCheckCondition condition) {"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -120,7 +120,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void assertBundleEquals(Bundle expected, Bundle observed) {"
         errorLine2="                                          ~~~~~~">
         <location
@@ -129,7 +129,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 void assertBundleEquals(Bundle expected, Bundle observed) {"
         errorLine2="                                                           ~~~~~~">
         <location
diff --git a/media2/integration-tests/testapp/lint-baseline.xml b/media2/integration-tests/testapp/lint-baseline.xml
index 7e0f108..912b0ba 100644
--- a/media2/integration-tests/testapp/lint-baseline.xml
+++ b/media2/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -20,141 +20,6 @@
     </issue>
 
     <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `showErrorDialogIfFailed` of class `VideoPlayerActivity` requires synthetic accessor"
-        errorLine1="            showErrorDialogIfFailed(controller.setMediaItem(mUri.toString()),"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoPlayerActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `showErrorDialogIfFailed` of class `VideoPlayerActivity` requires synthetic accessor"
-        errorLine1="            showErrorDialogIfFailed(controller.prepare(), &quot;failed to prepare &quot; + mUri);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoPlayerActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createLaunchIntent` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="                Intent launch = createLaunchIntent("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mUrlText` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="                        mUrlText.getText().toString());"
-        errorLine2="                        ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSelectItems` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="            if ((position >= 0) &amp;&amp; (position &lt; mSelectItems.getCount())) {"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSelectItems` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="                VideoItem item = mSelectItems.getItem(position);"
-        errorLine2="                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createLaunchIntent` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="                    Intent launch = createLaunchIntent("
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `VideoItemList` requires synthetic accessor"
-        errorLine1="        VideoItemList retVal = new VideoItemList(p, is_root);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createVil` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="            return createVil(mPath);"
-        errorLine2="                   ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSelectItems` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="                mSelectItems = items;"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSelectItems` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="                mSelectList.setAdapter(mSelectItems);"
-        errorLine2="                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSelectList` of class `VideoSelectorActivity` requires synthetic accessor"
-        errorLine1="                mSelectList.setAdapter(mSelectItems);"
-        errorLine2="                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSelectorActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayer` of class `VideoSessionService` requires synthetic accessor"
-        errorLine1="            mMediaPlayer.reset();"
-        errorLine2="            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSessionService.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAudioAttributes` of class `VideoSessionService` requires synthetic accessor"
-        errorLine1="            showToastIfFailed(mMediaPlayer.setAudioAttributes(mAudioAttributes),"
-        errorLine2="                                                              ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSessionService.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayer` of class `VideoSessionService` requires synthetic accessor"
-        errorLine1="            showToastIfFailed(mMediaPlayer.setAudioAttributes(mAudioAttributes),"
-        errorLine2="                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/media2/integration/testapp/VideoSessionService.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 onCreate(Bundle savedInstanceState) {"
diff --git a/media2/media2-common/lint-baseline.xml b/media2/media2-common/lint-baseline.xml
index b2a8847..37f296f 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.1.0-beta02" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-beta02)" variant="all" version="7.1.0-beta02">
+<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="KotlinPropertyAccess"
@@ -12,7 +12,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            Executor executor, OnMetadataChangedListener listener) {"
         errorLine2="            ~~~~~~~~">
         <location
@@ -21,7 +21,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            Executor executor, OnMetadataChangedListener listener) {"
         errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -30,7 +30,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 removeOnMetadataChangedListener(OnMetadataChangedListener listener) {"
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -39,7 +39,7 @@
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
diff --git a/media2/media2-player/lint-baseline.xml b/media2/media2-player/lint-baseline.xml
index b5478ee..ff716c8 100644
--- a/media2/media2-player/lint-baseline.xml
+++ b/media2/media2-player/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -250,8 +250,7 @@
         errorLine1="        void onLoop(MediaItem mediaItem);"
         errorLine2="                    ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"
-            column="21"/>
+            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"/>
     </issue>
 
     <issue
@@ -260,9 +259,7 @@
         errorLine1="        void onMediaTimeDiscontinuity(MediaItem mediaItem, MediaTimestamp mediaTimestamp);"
         errorLine2="                                      ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"
-            line="135"
-            column="39"/>
+            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"/>
     </issue>
 
     <issue
@@ -271,9 +268,7 @@
         errorLine1="        void onMediaTimeDiscontinuity(MediaItem mediaItem, MediaTimestamp mediaTimestamp);"
         errorLine2="                                                           ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"
-            line="135"
-            column="60"/>
+            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"/>
     </issue>
 
     <issue
@@ -282,9 +277,7 @@
         errorLine1="        void onPlaybackEnded(MediaItem mediaItem);"
         errorLine2="                             ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"
-            line="138"
-            column="30"/>
+            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"/>
     </issue>
 
     <issue
@@ -293,9 +286,7 @@
         errorLine1="        void onError(MediaItem mediaItem, int what);"
         errorLine2="                     ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"
-            line="141"
-            column="22"/>
+            file="src/main/java/androidx/media2/player/ExoPlayerWrapper.java"/>
     </issue>
 
     <issue
@@ -304,9 +295,7 @@
         errorLine1="    public PersistableBundle getMetrics() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer.java"
-            line="2167"
-            column="12"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer.java"/>
     </issue>
 
     <issue
@@ -315,9 +304,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, int width, int height) { }"
         errorLine2="                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="824"
-            column="17"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -326,9 +313,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, int width, int height) { }"
         errorLine2="                                 ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="824"
-            column="34"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -337,9 +322,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, TimedMetaData data) { }"
         errorLine2="                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="844"
-            column="17"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -348,9 +331,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, TimedMetaData data) { }"
         errorLine2="                                 ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="844"
-            column="34"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -359,9 +340,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, TimedMetaData data) { }"
         errorLine2="                                                 ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="844"
-            column="50"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -370,9 +349,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, @MediaError int what, int extra) { }"
         errorLine2="                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="856"
-            column="17"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -381,9 +358,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, @MediaError int what, int extra) { }"
         errorLine2="                                 ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="856"
-            column="34"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -392,9 +367,7 @@
         errorLine1="        public void onInfo(MediaPlayer2 mp, MediaItem item, @MediaInfo int what, int extra) { }"
         errorLine2="                           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="867"
-            column="28"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -403,9 +376,7 @@
         errorLine1="        public void onInfo(MediaPlayer2 mp, MediaItem item, @MediaInfo int what, int extra) { }"
         errorLine2="                                            ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="867"
-            column="45"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -414,9 +385,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, @CallCompleted int what,"
         errorLine2="                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="878"
-            column="17"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -425,9 +394,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, @CallCompleted int what,"
         errorLine2="                                 ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="878"
-            column="34"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -436,9 +403,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, MediaTimestamp timestamp) { }"
         errorLine2="                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="902"
-            column="17"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -447,9 +412,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, MediaTimestamp timestamp) { }"
         errorLine2="                                 ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="902"
-            column="34"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -458,9 +421,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, MediaTimestamp timestamp) { }"
         errorLine2="                                                 ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="902"
-            column="50"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -469,9 +430,7 @@
         errorLine1="        public void onCommandLabelReached(MediaPlayer2 mp, @NonNull Object label) { }"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="911"
-            column="43"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -480,9 +439,7 @@
         errorLine1="        void onDrmConfig(MediaPlayer2 mp, MediaItem item);"
         errorLine2="                         ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1452"
-            column="26"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -491,9 +448,7 @@
         errorLine1="        void onDrmConfig(MediaPlayer2 mp, MediaItem item);"
         errorLine2="                                          ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1452"
-            column="43"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -502,9 +457,7 @@
         errorLine1="        public void onDrmInfo(MediaPlayer2 mp, MediaItem item, DrmInfo drmInfo) { }"
         errorLine2="                              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1479"
-            column="31"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -513,9 +466,7 @@
         errorLine1="        public void onDrmInfo(MediaPlayer2 mp, MediaItem item, DrmInfo drmInfo) { }"
         errorLine2="                                               ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1479"
-            column="48"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -524,9 +475,7 @@
         errorLine1="        public void onDrmInfo(MediaPlayer2 mp, MediaItem item, DrmInfo drmInfo) { }"
         errorLine2="                                                               ~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1479"
-            column="64"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -535,9 +484,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, @PrepareDrmStatusCode int status) { }"
         errorLine2="                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1490"
-            column="17"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -546,9 +493,7 @@
         errorLine1="                MediaPlayer2 mp, MediaItem item, @PrepareDrmStatusCode int status) { }"
         errorLine2="                                 ~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1490"
-            column="34"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -557,9 +502,7 @@
         errorLine1="        public abstract Map&lt;UUID, byte[]&gt; getPssh();"
         errorLine2="                        ~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1714"
-            column="25"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -568,9 +511,7 @@
         errorLine1="        public abstract List&lt;UUID> getSupportedSchemes();"
         errorLine2="                        ~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/MediaPlayer2.java"
-            line="1721"
-            column="25"/>
+            file="src/main/java/androidx/media2/player/MediaPlayer2.java"/>
     </issue>
 
     <issue
@@ -579,9 +520,7 @@
         errorLine1="    public android.media.PlaybackParams getPlaybackParams() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/PlaybackParams.java"
-            line="166"
-            column="12"/>
+            file="src/main/java/androidx/media2/player/PlaybackParams.java"/>
     </issue>
 
     <issue
@@ -590,9 +529,7 @@
         errorLine1="        public Builder(android.media.PlaybackParams playbackParams) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/PlaybackParams.java"
-            line="196"
-            column="24"/>
+            file="src/main/java/androidx/media2/player/PlaybackParams.java"/>
     </issue>
 
     <issue
@@ -601,9 +538,7 @@
         errorLine1="        void onCcData(byte[] data, long timeUs);"
         errorLine2="                      ~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/TextRenderer.java"
-            line="53"
-            column="23"/>
+            file="src/main/java/androidx/media2/player/TextRenderer.java"/>
     </issue>
 
     <issue
@@ -612,9 +547,7 @@
         errorLine1="    public TimedMetaData(long timestampUs, byte[] metaData) {"
         errorLine2="                                           ~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/TimedMetaData.java"
-            line="43"
-            column="44"/>
+            file="src/main/java/androidx/media2/player/TimedMetaData.java"/>
     </issue>
 
     <issue
@@ -623,9 +556,7 @@
         errorLine1="    public byte[] getMetaData() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/androidx/media2/player/TimedMetaData.java"
-            line="60"
-            column="12"/>
+            file="src/main/java/androidx/media2/player/TimedMetaData.java"/>
     </issue>
 
 </issues>
diff --git a/media2/media2-session/lint-baseline.xml b/media2/media2-session/lint-baseline.xml
index 06676bf..8ab5ac9 100644
--- a/media2/media2-session/lint-baseline.xml
+++ b/media2/media2-session/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="WrongConstant"
diff --git a/media2/media2-session/version-compat-tests/common/lint-baseline.xml b/media2/media2-session/version-compat-tests/common/lint-baseline.xml
index 65cdb74..2da113c 100644
--- a/media2/media2-session/version-compat-tests/common/lint-baseline.xml
+++ b/media2/media2-session/version-compat-tests/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/media2/media2-widget/lint-baseline.xml b/media2/media2-widget/lint-baseline.xml
index ef484c0..fa863c1 100644
--- a/media2/media2-widget/lint-baseline.xml
+++ b/media2/media2-widget/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/mediarouter/mediarouter/lint-baseline.xml b/mediarouter/mediarouter/lint-baseline.xml
index dada845..5575eb0 100644
--- a/mediarouter/mediarouter/lint-baseline.xml
+++ b/mediarouter/mediarouter/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -20,42 +20,6 @@
     </issue>
 
     <issue
-        id="BanUncheckedReflection"
-        message="Calling `Method.invoke` without an SDK check"
-        errorLine1="                        mSelectRouteIntMethod.invoke(router, types, route);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="jellybean/androidx/mediarouter/media/MediaRouterJellybean.java"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling `Method.invoke` without an SDK check"
-        errorLine1="                    return mGetSystemAudioRouteMethod.invoke(router);"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="jellybean/androidx/mediarouter/media/MediaRouterJellybean.java"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling `Method.invoke` without an SDK check"
-        errorLine1="                    mScanWifiDisplaysMethod.invoke(mDisplayManager);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="jellybean-mr1/androidx/mediarouter/media/MediaRouterJellybeanMr1.java"/>
-    </issue>
-
-    <issue
-        id="BanUncheckedReflection"
-        message="Calling `Method.invoke` without an SDK check"
-        errorLine1="                    int statusCode = (Integer)mGetStatusCodeMethod.invoke(route);"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="jellybean-mr1/androidx/mediarouter/media/MediaRouterJellybeanMr1.java"/>
-    </issue>
-
-    <issue
         id="ClassVerificationFailure"
         message="This call references a method added in API level 17; however, the containing class androidx.mediarouter.app.MediaRouteDynamicControllerDialog is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="        ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));"
diff --git a/navigation/integration-tests/testapp/lint-baseline.xml b/navigation/integration-tests/testapp/lint-baseline.xml
index 6902f84..acc57fc 100644
--- a/navigation/integration-tests/testapp/lint-baseline.xml
+++ b/navigation/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/paging/integration-tests/testapp/lint-baseline.xml b/paging/integration-tests/testapp/lint-baseline.xml
index b6e7857..9aa9f52 100644
--- a/paging/integration-tests/testapp/lint-baseline.xml
+++ b/paging/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha08)" variant="all" version="7.3.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="MissingInflatedId"
@@ -20,15 +20,6 @@
     </issue>
 
     <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `LastNameAscCustomerDataSource` requires synthetic accessor"
-        errorLine1="                return new LastNameAscCustomerDataSource(db);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/paging/integration/testapp/room/LastNameAscCustomerDataSource.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 String getName() {"
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/InvalidateCallbackTracker.kt b/paging/paging-common/src/main/kotlin/androidx/paging/InvalidateCallbackTracker.kt
index 727fdf8..2d6393b 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/InvalidateCallbackTracker.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/InvalidateCallbackTracker.kt
@@ -71,12 +71,12 @@
         }
     }
 
-    internal fun invalidate() {
-        if (invalid) return
+    internal fun invalidate(): Boolean {
+        if (invalid) return false
 
         var callbacksToInvoke: List<T>?
         lock.withLock {
-            if (invalid) return
+            if (invalid) return false
 
             invalid = true
             callbacksToInvoke = callbacks.toList()
@@ -84,5 +84,6 @@
         }
 
         callbacksToInvoke?.forEach(callbackInvoker)
+        return true
     }
 }
\ No newline at end of file
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PageEvent.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PageEvent.kt
index cfbc967..43302de 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PageEvent.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PageEvent.kt
@@ -19,6 +19,7 @@
 import androidx.paging.LoadType.APPEND
 import androidx.paging.LoadType.PREPEND
 import androidx.paging.LoadType.REFRESH
+import androidx.paging.internal.appendMediatorStatesIfNotNull
 
 /**
  * Events in the stream from paging fetch logic to UI.
@@ -313,15 +314,4 @@
     }
 
     open suspend fun filter(predicate: suspend (T) -> Boolean): PageEvent<T> = this
-
-    protected inline fun appendMediatorStatesIfNotNull(
-        mediatorStates: LoadStates?,
-        log: () -> String
-    ): String {
-        var newLog = log()
-        if (mediatorStates != null) {
-            newLog = newLog.plus("""|   mediatorLoadStates: $mediatorStates${"\n"}""")
-        }
-        return newLog.plus("|)").trimMargin()
-    }
 }
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcher.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcher.kt
index 5997922..59130e8 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcher.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcher.kt
@@ -97,7 +97,9 @@
 
                 val initialKey: Key? = when (previousPagingState) {
                     null -> initialKey
-                    else -> pagingSource.getRefreshKey(previousPagingState)
+                    else -> pagingSource.getRefreshKey(previousPagingState).also {
+                        log(DEBUG) { "Refresh key $it returned from PagingSource $pagingSource" }
+                    }
                 }
 
                 previousGeneration?.snapshot?.close()
@@ -222,6 +224,7 @@
         pagingSource.registerInvalidatedCallback(::invalidate)
         previousPagingSource?.unregisterInvalidatedCallback(::invalidate)
         previousPagingSource?.invalidate() // Note: Invalidate is idempotent.
+        log(DEBUG) { "Generated new PagingSource $pagingSource" }
 
         return pagingSource
     }
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
index 1518b6d..929da61 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
@@ -222,6 +222,7 @@
                             hint.presentedItemsAfter * -1 > config.jumpThreshold
                     }
                 if (jumpHint != null) {
+                    log(DEBUG) { "Jump triggered on PagingSource $pagingSource by $jumpHint" }
                     jumpCallback()
                 }
             }
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PagingDataDiffer.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PagingDataDiffer.kt
index f061f40..03a39e0 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PagingDataDiffer.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PagingDataDiffer.kt
@@ -26,6 +26,7 @@
 import androidx.paging.PageEvent.StaticList
 import androidx.paging.PagePresenter.ProcessPageEventCallback
 import androidx.paging.internal.BUGANIZER_URL
+import androidx.paging.internal.appendMediatorStatesIfNotNull
 import java.util.concurrent.CopyOnWriteArrayList
 import kotlin.coroutines.CoroutineContext
 import kotlinx.coroutines.Dispatchers
@@ -265,6 +266,7 @@
         lastAccessedIndexUnfulfilled = true
         lastAccessedIndex = index
 
+        log(VERBOSE) { "Accessing item index[$index]" }
         hintReceiver?.accessHint(presenter.accessHintForPresenterIndex(index))
         return presenter.get(index)
     }
@@ -298,6 +300,7 @@
      *  * [RemoteMediator.load] returning [RemoteMediator.MediatorResult.Error]
      */
     public fun retry() {
+        log(DEBUG) { "Retry signal received" }
         uiReceiver?.retry()
     }
 
@@ -318,6 +321,7 @@
      * @sample androidx.paging.samples.refreshSample
      */
     public fun refresh() {
+        log(DEBUG) { "Refresh signal received" }
         uiReceiver?.refresh()
     }
 
@@ -460,6 +464,18 @@
                 presenter = newPresenter
                 onListPresentableCalled = true
                 hintReceiver = newHintReceiver
+                log(DEBUG) {
+                    appendMediatorStatesIfNotNull(mediatorLoadStates) {
+                        """Presenting data:
+                            |   first item: ${pages.firstOrNull()?.data?.firstOrNull()}
+                            |   last item: ${pages.lastOrNull()?.data?.lastOrNull()}
+                            |   placeholdersBefore: $placeholdersBefore
+                            |   placeholdersAfter: $placeholdersAfter
+                            |   hintReceiver: $newHintReceiver
+                            |   sourceLoadStates: $sourceLoadStates
+                        """
+                    }
+                }
             }
         )
         check(onListPresentableCalled) {
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt
index fbc3ca9..8feda0d 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PagingSource.kt
@@ -354,7 +354,9 @@
      * this method should have no effect.
      */
     public fun invalidate() {
-        invalidateCallbackTracker.invalidate()
+        if (invalidateCallbackTracker.invalidate()) {
+            log(DEBUG) { "Invalidated PagingSource $this" }
+        }
     }
 
     /**
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/internal/LogUtil.kt b/paging/paging-common/src/main/kotlin/androidx/paging/internal/LogUtil.kt
new file mode 100644
index 0000000..b567edd
--- /dev/null
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/internal/LogUtil.kt
@@ -0,0 +1,32 @@
+/*
+ * 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)
+
+package androidx.paging.internal
+
+import androidx.annotation.RestrictTo
+import androidx.paging.LoadStates
+
+internal inline fun appendMediatorStatesIfNotNull(
+    mediatorStates: LoadStates?,
+    log: () -> String
+): String {
+    var newLog = log()
+    if (mediatorStates != null) {
+        newLog = newLog.plus("""|   mediatorLoadStates: $mediatorStates${"\n"}""")
+    }
+    return newLog.plus("|)").trimMargin()
+}
\ No newline at end of file
diff --git a/preference/preference/lint-baseline.xml b/preference/preference/lint-baseline.xml
index 3c0ec46..b4ab971 100644
--- a/preference/preference/lint-baseline.xml
+++ b/preference/preference/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/privacysandbox/OWNERS b/privacysandbox/OWNERS
new file mode 100644
index 0000000..518859b
--- /dev/null
+++ b/privacysandbox/OWNERS
@@ -0,0 +1,3 @@
+abz@google.com
+ltenorio@google.com
+nicoroulet@google.com
diff --git a/privacysandbox/tools/tools-apicompiler/build.gradle b/privacysandbox/tools/tools-apicompiler/build.gradle
new file mode 100644
index 0000000..ea076e7
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/build.gradle
@@ -0,0 +1,34 @@
+/*
+ * 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("kotlin")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+}
+
+androidx {
+    name = "androidx.privacysandbox.tools:tools-apicompiler"
+    type = LibraryType.ANNOTATION_PROCESSOR
+    mavenGroup = LibraryGroups.PRIVACYSANDBOX_TOOLS
+    inceptionYear = "2022"
+    description = "Compiler for Privacy Sandbox API annotations."
+}
diff --git a/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/Compiler.kt b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/Compiler.kt
new file mode 100644
index 0000000..4f92192
--- /dev/null
+++ b/privacysandbox/tools/tools-apicompiler/src/main/java/androidx/privacysandbox/tools/apicompiler/Compiler.kt
@@ -0,0 +1,17 @@
+/*
+ * 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.privacysandbox.tools.apicompiler
\ No newline at end of file
diff --git a/privacysandbox/tools/tools-apigenerator/build.gradle b/privacysandbox/tools/tools-apigenerator/build.gradle
new file mode 100644
index 0000000..125c7fb
--- /dev/null
+++ b/privacysandbox/tools/tools-apigenerator/build.gradle
@@ -0,0 +1,34 @@
+/*
+ * 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("kotlin")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+}
+
+androidx {
+    name = "androidx.privacysandbox.tools:tools-apigenerator"
+    type = LibraryType.OTHER_CODE_PROCESSOR
+    mavenGroup = LibraryGroups.PRIVACYSANDBOX_TOOLS
+    inceptionYear = "2022"
+    description = "Generate sources for communication with SDKs in the Privacy Sandbox."
+}
diff --git a/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
new file mode 100644
index 0000000..c4940c5b
--- /dev/null
+++ b/privacysandbox/tools/tools-apigenerator/src/main/java/androidx/privacysandbox/tools/apigenerator/Generator.kt
@@ -0,0 +1,17 @@
+/*
+ * 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.privacysandbox.tools.apigenerator
\ No newline at end of file
diff --git a/privacysandbox/tools/tools/api/current.txt b/privacysandbox/tools/tools/api/current.txt
new file mode 100644
index 0000000..2083825
--- /dev/null
+++ b/privacysandbox/tools/tools/api/current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.privacysandbox.tools {
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface PrivacySandboxService {
+  }
+
+}
+
diff --git a/privacysandbox/tools/tools/api/public_plus_experimental_current.txt b/privacysandbox/tools/tools/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..2083825
--- /dev/null
+++ b/privacysandbox/tools/tools/api/public_plus_experimental_current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.privacysandbox.tools {
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface PrivacySandboxService {
+  }
+
+}
+
diff --git a/privacysandbox/tools/tools/api/res-current.txt b/privacysandbox/tools/tools/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/privacysandbox/tools/tools/api/res-current.txt
diff --git a/privacysandbox/tools/tools/api/restricted_current.txt b/privacysandbox/tools/tools/api/restricted_current.txt
new file mode 100644
index 0000000..2083825
--- /dev/null
+++ b/privacysandbox/tools/tools/api/restricted_current.txt
@@ -0,0 +1,8 @@
+// Signature format: 4.0
+package androidx.privacysandbox.tools {
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface PrivacySandboxService {
+  }
+
+}
+
diff --git a/privacysandbox/tools/tools/build.gradle b/privacysandbox/tools/tools/build.gradle
new file mode 100644
index 0000000..f68947c
--- /dev/null
+++ b/privacysandbox/tools/tools/build.gradle
@@ -0,0 +1,34 @@
+/*
+ * 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("kotlin")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+}
+
+androidx {
+    name = "androidx.privacysandbox.tools:tools"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.PRIVACYSANDBOX_TOOLS
+    inceptionYear = "2022"
+    description = "Tools for comunicating with SDKs running in the Privacy Sandbox."
+}
diff --git a/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt
new file mode 100644
index 0000000..cd87506
--- /dev/null
+++ b/privacysandbox/tools/tools/src/main/java/androidx/privacysandbox/tools/PrivacySandboxService.kt
@@ -0,0 +1,22 @@
+/*
+ * 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.privacysandbox.tools
+
+/** Entry point for an SDK service running in the privacy sandbox. */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.CLASS)
+public annotation class PrivacySandboxService
\ No newline at end of file
diff --git a/recyclerview/recyclerview/api/1.3.0-beta02.txt b/recyclerview/recyclerview/api/1.3.0-beta02.txt
index ba238e0..7e45fbb 100644
--- a/recyclerview/recyclerview/api/1.3.0-beta02.txt
+++ b/recyclerview/recyclerview/api/1.3.0-beta02.txt
@@ -3,7 +3,7 @@
 
   public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -64,7 +64,7 @@
   public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
     method public void dispatchLastEvent();
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -110,11 +110,11 @@
 
   public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
     ctor public DefaultItemAnimator();
-    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
-    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public void endAnimations();
     method public boolean isRunning();
     method public void runPendingAnimations();
@@ -150,7 +150,7 @@
   }
 
   public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
-    ctor public DividerItemDecoration(android.content.Context, int);
+    ctor public DividerItemDecoration(android.content.Context!, int);
     method public android.graphics.drawable.Drawable? getDrawable();
     method public void setDrawable(android.graphics.drawable.Drawable);
     method public void setOrientation(int);
@@ -224,7 +224,7 @@
   public abstract static class ItemTouchHelper.Callback {
     ctor public ItemTouchHelper.Callback();
     method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
     method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public int convertToAbsoluteDirection(int, int);
     method public static int convertToRelativeDirection(int, int);
@@ -242,7 +242,7 @@
     method public static int makeFlag(int, int);
     method public static int makeMovementFlags(int, int);
     method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
     method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
     method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
@@ -265,23 +265,23 @@
   }
 
   public interface ItemTouchUIUtil {
-    method public void clearView(android.view.View);
-    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onSelected(android.view.View);
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
   }
 
   public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
     ctor public LinearLayoutManager(android.content.Context!);
     ctor public LinearLayoutManager(android.content.Context!, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
     method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
-    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
     method public int findFirstCompletelyVisibleItemPosition();
     method public int findFirstVisibleItemPosition();
     method public int findLastCompletelyVisibleItemPosition();
     method public int findLastVisibleItemPosition();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
     method public int getInitialPrefetchItemCount();
     method public int getOrientation();
@@ -312,20 +312,20 @@
   }
 
   public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
+    ctor public LinearSmoothScroller(android.content.Context!);
     method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
     method protected int calculateTimeForDeceleration(int);
     method protected int calculateTimeForScrolling(int);
     method protected int getHorizontalSnapPreference();
     method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     method protected void onStart();
     method protected void onStop();
-    method protected void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     field public static final int SNAP_TO_ANY = 0; // 0x0
     field public static final int SNAP_TO_END = 1; // 0x1
     field public static final int SNAP_TO_START = -1; // 0xffffffff
@@ -333,7 +333,7 @@
     field protected int mInterimTargetDx;
     field protected int mInterimTargetDy;
     field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
-    field protected android.graphics.PointF? mTargetVector;
+    field protected android.graphics.PointF! mTargetVector;
   }
 
   public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
@@ -391,8 +391,8 @@
   public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
     ctor public PagerSnapHelper();
     method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
   }
 
   public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
@@ -646,7 +646,7 @@
     method public void addView(android.view.View!);
     method public void addView(android.view.View!, int);
     method public void assertInLayoutOrScroll(String!);
-    method public void assertNotInLayoutOrScroll(String?);
+    method public void assertNotInLayoutOrScroll(String!);
     method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public void attachView(android.view.View, int);
     method public void attachView(android.view.View);
@@ -655,8 +655,8 @@
     method public boolean canScrollVertically();
     method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public static int chooseSize(int, int, int);
-    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
     method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
@@ -671,7 +671,7 @@
     method public void endAnimation(android.view.View!);
     method public android.view.View? findContainingItemView(android.view.View);
     method public android.view.View? findViewByPosition(int);
-    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
     method public int getBaseline();
@@ -734,7 +734,7 @@
     method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
     method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
     method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
-    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
     method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
     method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
@@ -747,12 +747,12 @@
     method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
-    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
     method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
     method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
     method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
-    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
     method public android.os.Parcelable? onSaveInstanceState();
     method public void onScrollStateChanged(int);
     method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
@@ -770,15 +770,15 @@
     method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
     method public void requestLayout();
     method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method @Deprecated public void setAutoMeasureEnabled(boolean);
     method public final void setItemPrefetchEnabled(boolean);
     method public void setMeasuredDimension(android.graphics.Rect!, int, int);
     method public void setMeasuredDimension(int, int);
     method public void setMeasurementCacheEnabled(boolean);
-    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
     method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
     method public void stopIgnoringView(android.view.View);
     method public boolean supportsPredictiveItemAnimations();
@@ -957,21 +957,21 @@
 
   public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
     ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
     method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
-    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean getSupportsChangeAnimations();
     method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
@@ -989,11 +989,11 @@
     ctor public SnapHelper();
     method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
     method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public int[] calculateScrollDistance(int, int);
+    method public int[]! calculateScrollDistance(int, int);
     method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
     method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
     method public boolean onFling(int, int);
   }
 
@@ -1021,7 +1021,7 @@
   }
 
   public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>);
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
     method public boolean areContentsTheSame(T2!, T2!);
     method public boolean areItemsTheSame(T2!, T2!);
     method public int compare(T2!, T2!);
@@ -1039,11 +1039,11 @@
     method public abstract int compare(T2!, T2!);
     method public Object? getChangePayload(T2!, T2!);
     method public abstract void onChanged(int, int);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
   }
 
   public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>);
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
     method public void onChanged(int, int);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
diff --git a/recyclerview/recyclerview/api/current.ignore b/recyclerview/recyclerview/api/current.ignore
index de0ee4c..f5042d6 100644
--- a/recyclerview/recyclerview/api/current.ignore
+++ b/recyclerview/recyclerview/api/current.ignore
@@ -1,5 +1,135 @@
 // Baseline format: 1.0
+InvalidNullConversion: androidx.recyclerview.widget.AdapterListUpdateCallback#onChanged(int, int, Object) parameter #2:
+    Attempted to remove @Nullable annotation from parameter arg3 in androidx.recyclerview.widget.AdapterListUpdateCallback.onChanged(int arg1, int arg2, Object arg3)
+InvalidNullConversion: androidx.recyclerview.widget.BatchingListUpdateCallback#onChanged(int, int, Object) parameter #2:
+    Attempted to remove @Nullable annotation from parameter arg3 in androidx.recyclerview.widget.BatchingListUpdateCallback.onChanged(int arg1, int arg2, Object arg3)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #1:
+    Attempted to remove @Nullable annotation from parameter arg2 in androidx.recyclerview.widget.DefaultItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, int arg2, int arg3, int arg4, int arg5)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.DividerItemDecoration#DividerItemDecoration(android.content.Context, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DividerItemDecoration(android.content.Context arg1, int arg2)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchHelper.Callback#chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder>, int, int):
+    Attempted to remove @Nullable annotation from method androidx.recyclerview.widget.ItemTouchHelper.Callback.chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder,java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder>,int,int)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchHelper.Callback#onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.ItemTouchHelper.Callback.onChildDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, androidx.recyclerview.widget.RecyclerView.ViewHolder arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#clearView(android.view.View) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.clearView(android.view.View arg1)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.onDraw(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.ItemTouchUIUtil.onDraw(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.ItemTouchUIUtil.onDraw(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.onDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.ItemTouchUIUtil.onDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.ItemTouchUIUtil.onDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onSelected(android.view.View) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.onSelected(android.view.View arg1)
 InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context) parameter #0:
     Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1, android.util.AttributeSet arg2, int arg3, int arg4)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
+    Attempted to remove @Nullable annotation from parameter arg2 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1, android.util.AttributeSet arg2, int arg3, int arg4)
 InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context, int, boolean) parameter #0:
     Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1, int arg2, boolean arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#computeScrollVectorForPosition(int):
+    Attempted to remove @Nullable annotation from method androidx.recyclerview.widget.LinearLayoutManager.computeScrollVectorForPosition(int)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#generateDefaultLayoutParams():
+    Attempted to remove @NonNull annotation from method androidx.recyclerview.widget.LinearLayoutManager.generateDefaultLayoutParams()
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#LinearSmoothScroller(android.content.Context) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller(android.content.Context arg1)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#calculateDxToMakeVisible(android.view.View, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.calculateDxToMakeVisible(android.view.View arg1, int arg2)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#calculateDyToMakeVisible(android.view.View, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.calculateDyToMakeVisible(android.view.View arg1, int arg2)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#calculateSpeedPerPixel(android.util.DisplayMetrics) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.calculateSpeedPerPixel(android.util.DisplayMetrics arg1)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#mTargetVector:
+    Attempted to remove @Nullable annotation from field androidx.recyclerview.widget.LinearSmoothScroller.mTargetVector
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.LinearSmoothScroller.onSeekTargetStep(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg4)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #3:
+    Attempted to remove @NonNull annotation from parameter arg4 in androidx.recyclerview.widget.LinearSmoothScroller.onSeekTargetStep(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg4)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.onTargetFound(android.view.View arg1, androidx.recyclerview.widget.RecyclerView.State arg2, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.LinearSmoothScroller.onTargetFound(android.view.View arg1, androidx.recyclerview.widget.RecyclerView.State arg2, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.LinearSmoothScroller.onTargetFound(android.view.View arg1, androidx.recyclerview.widget.RecyclerView.State arg2, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg1)
+InvalidNullConversion: androidx.recyclerview.widget.PagerSnapHelper#findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.PagerSnapHelper.findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1)
+InvalidNullConversion: androidx.recyclerview.widget.PagerSnapHelper#findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.PagerSnapHelper.findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1, int arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#assertNotInLayoutOrScroll(String) parameter #0:
+    Attempted to remove @Nullable annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.assertNotInLayoutOrScroll(String arg1)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.RecyclerView.LayoutManager.collectAdjacentPrefetchPositions(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry arg4)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry) parameter #3:
+    Attempted to remove @NonNull annotation from parameter arg4 in androidx.recyclerview.widget.RecyclerView.LayoutManager.collectAdjacentPrefetchPositions(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry arg4)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.collectInitialPrefetchPositions(int arg1, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#generateDefaultLayoutParams():
+    Attempted to remove @NonNull annotation from method androidx.recyclerview.widget.RecyclerView.LayoutManager.generateDefaultLayoutParams()
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler arg1, androidx.recyclerview.widget.RecyclerView.State arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler arg1, androidx.recyclerview.widget.RecyclerView.State arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State arg1)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onRestoreInstanceState(android.os.Parcelable) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onRestoreInstanceState(android.os.Parcelable arg1)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollHorizontallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollHorizontallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollVerticallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollVerticallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.State arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.State arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #1:
+    Attempted to remove @Nullable annotation from parameter arg2 in androidx.recyclerview.widget.SimpleItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, int arg2, int arg3, int arg4, int arg5)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SnapHelper#calculateScrollDistance(int, int):
+    Attempted to remove @NonNull annotation from method androidx.recyclerview.widget.SnapHelper.calculateScrollDistance(int,int)
+InvalidNullConversion: androidx.recyclerview.widget.SnapHelper#findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SnapHelper.findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SnapHelper#findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SnapHelper.findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1, int arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.SortedList.BatchedCallback#BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2>) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2> arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SortedList.Callback#onChanged(int, int, Object) parameter #2:
+    Attempted to remove @Nullable annotation from parameter arg3 in androidx.recyclerview.widget.SortedList.Callback.onChanged(int arg1, int arg2, Object arg3)
+InvalidNullConversion: androidx.recyclerview.widget.SortedListAdapterCallback#SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?> arg1)
diff --git a/recyclerview/recyclerview/api/current.txt b/recyclerview/recyclerview/api/current.txt
index ba238e0..7e45fbb 100644
--- a/recyclerview/recyclerview/api/current.txt
+++ b/recyclerview/recyclerview/api/current.txt
@@ -3,7 +3,7 @@
 
   public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -64,7 +64,7 @@
   public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
     method public void dispatchLastEvent();
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -110,11 +110,11 @@
 
   public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
     ctor public DefaultItemAnimator();
-    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
-    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public void endAnimations();
     method public boolean isRunning();
     method public void runPendingAnimations();
@@ -150,7 +150,7 @@
   }
 
   public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
-    ctor public DividerItemDecoration(android.content.Context, int);
+    ctor public DividerItemDecoration(android.content.Context!, int);
     method public android.graphics.drawable.Drawable? getDrawable();
     method public void setDrawable(android.graphics.drawable.Drawable);
     method public void setOrientation(int);
@@ -224,7 +224,7 @@
   public abstract static class ItemTouchHelper.Callback {
     ctor public ItemTouchHelper.Callback();
     method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
     method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public int convertToAbsoluteDirection(int, int);
     method public static int convertToRelativeDirection(int, int);
@@ -242,7 +242,7 @@
     method public static int makeFlag(int, int);
     method public static int makeMovementFlags(int, int);
     method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
     method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
     method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
@@ -265,23 +265,23 @@
   }
 
   public interface ItemTouchUIUtil {
-    method public void clearView(android.view.View);
-    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onSelected(android.view.View);
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
   }
 
   public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
     ctor public LinearLayoutManager(android.content.Context!);
     ctor public LinearLayoutManager(android.content.Context!, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
     method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
-    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
     method public int findFirstCompletelyVisibleItemPosition();
     method public int findFirstVisibleItemPosition();
     method public int findLastCompletelyVisibleItemPosition();
     method public int findLastVisibleItemPosition();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
     method public int getInitialPrefetchItemCount();
     method public int getOrientation();
@@ -312,20 +312,20 @@
   }
 
   public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
+    ctor public LinearSmoothScroller(android.content.Context!);
     method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
     method protected int calculateTimeForDeceleration(int);
     method protected int calculateTimeForScrolling(int);
     method protected int getHorizontalSnapPreference();
     method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     method protected void onStart();
     method protected void onStop();
-    method protected void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     field public static final int SNAP_TO_ANY = 0; // 0x0
     field public static final int SNAP_TO_END = 1; // 0x1
     field public static final int SNAP_TO_START = -1; // 0xffffffff
@@ -333,7 +333,7 @@
     field protected int mInterimTargetDx;
     field protected int mInterimTargetDy;
     field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
-    field protected android.graphics.PointF? mTargetVector;
+    field protected android.graphics.PointF! mTargetVector;
   }
 
   public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
@@ -391,8 +391,8 @@
   public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
     ctor public PagerSnapHelper();
     method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
   }
 
   public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
@@ -646,7 +646,7 @@
     method public void addView(android.view.View!);
     method public void addView(android.view.View!, int);
     method public void assertInLayoutOrScroll(String!);
-    method public void assertNotInLayoutOrScroll(String?);
+    method public void assertNotInLayoutOrScroll(String!);
     method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public void attachView(android.view.View, int);
     method public void attachView(android.view.View);
@@ -655,8 +655,8 @@
     method public boolean canScrollVertically();
     method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public static int chooseSize(int, int, int);
-    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
     method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
@@ -671,7 +671,7 @@
     method public void endAnimation(android.view.View!);
     method public android.view.View? findContainingItemView(android.view.View);
     method public android.view.View? findViewByPosition(int);
-    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
     method public int getBaseline();
@@ -734,7 +734,7 @@
     method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
     method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
     method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
-    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
     method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
     method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
@@ -747,12 +747,12 @@
     method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
-    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
     method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
     method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
     method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
-    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
     method public android.os.Parcelable? onSaveInstanceState();
     method public void onScrollStateChanged(int);
     method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
@@ -770,15 +770,15 @@
     method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
     method public void requestLayout();
     method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method @Deprecated public void setAutoMeasureEnabled(boolean);
     method public final void setItemPrefetchEnabled(boolean);
     method public void setMeasuredDimension(android.graphics.Rect!, int, int);
     method public void setMeasuredDimension(int, int);
     method public void setMeasurementCacheEnabled(boolean);
-    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
     method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
     method public void stopIgnoringView(android.view.View);
     method public boolean supportsPredictiveItemAnimations();
@@ -957,21 +957,21 @@
 
   public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
     ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
     method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
-    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean getSupportsChangeAnimations();
     method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
@@ -989,11 +989,11 @@
     ctor public SnapHelper();
     method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
     method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public int[] calculateScrollDistance(int, int);
+    method public int[]! calculateScrollDistance(int, int);
     method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
     method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
     method public boolean onFling(int, int);
   }
 
@@ -1021,7 +1021,7 @@
   }
 
   public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>);
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
     method public boolean areContentsTheSame(T2!, T2!);
     method public boolean areItemsTheSame(T2!, T2!);
     method public int compare(T2!, T2!);
@@ -1039,11 +1039,11 @@
     method public abstract int compare(T2!, T2!);
     method public Object? getChangePayload(T2!, T2!);
     method public abstract void onChanged(int, int);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
   }
 
   public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>);
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
     method public void onChanged(int, int);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
diff --git a/recyclerview/recyclerview/api/public_plus_experimental_1.3.0-beta02.txt b/recyclerview/recyclerview/api/public_plus_experimental_1.3.0-beta02.txt
index ba238e0..7e45fbb 100644
--- a/recyclerview/recyclerview/api/public_plus_experimental_1.3.0-beta02.txt
+++ b/recyclerview/recyclerview/api/public_plus_experimental_1.3.0-beta02.txt
@@ -3,7 +3,7 @@
 
   public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -64,7 +64,7 @@
   public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
     method public void dispatchLastEvent();
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -110,11 +110,11 @@
 
   public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
     ctor public DefaultItemAnimator();
-    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
-    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public void endAnimations();
     method public boolean isRunning();
     method public void runPendingAnimations();
@@ -150,7 +150,7 @@
   }
 
   public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
-    ctor public DividerItemDecoration(android.content.Context, int);
+    ctor public DividerItemDecoration(android.content.Context!, int);
     method public android.graphics.drawable.Drawable? getDrawable();
     method public void setDrawable(android.graphics.drawable.Drawable);
     method public void setOrientation(int);
@@ -224,7 +224,7 @@
   public abstract static class ItemTouchHelper.Callback {
     ctor public ItemTouchHelper.Callback();
     method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
     method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public int convertToAbsoluteDirection(int, int);
     method public static int convertToRelativeDirection(int, int);
@@ -242,7 +242,7 @@
     method public static int makeFlag(int, int);
     method public static int makeMovementFlags(int, int);
     method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
     method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
     method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
@@ -265,23 +265,23 @@
   }
 
   public interface ItemTouchUIUtil {
-    method public void clearView(android.view.View);
-    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onSelected(android.view.View);
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
   }
 
   public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
     ctor public LinearLayoutManager(android.content.Context!);
     ctor public LinearLayoutManager(android.content.Context!, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
     method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
-    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
     method public int findFirstCompletelyVisibleItemPosition();
     method public int findFirstVisibleItemPosition();
     method public int findLastCompletelyVisibleItemPosition();
     method public int findLastVisibleItemPosition();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
     method public int getInitialPrefetchItemCount();
     method public int getOrientation();
@@ -312,20 +312,20 @@
   }
 
   public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
+    ctor public LinearSmoothScroller(android.content.Context!);
     method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
     method protected int calculateTimeForDeceleration(int);
     method protected int calculateTimeForScrolling(int);
     method protected int getHorizontalSnapPreference();
     method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     method protected void onStart();
     method protected void onStop();
-    method protected void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     field public static final int SNAP_TO_ANY = 0; // 0x0
     field public static final int SNAP_TO_END = 1; // 0x1
     field public static final int SNAP_TO_START = -1; // 0xffffffff
@@ -333,7 +333,7 @@
     field protected int mInterimTargetDx;
     field protected int mInterimTargetDy;
     field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
-    field protected android.graphics.PointF? mTargetVector;
+    field protected android.graphics.PointF! mTargetVector;
   }
 
   public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
@@ -391,8 +391,8 @@
   public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
     ctor public PagerSnapHelper();
     method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
   }
 
   public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
@@ -646,7 +646,7 @@
     method public void addView(android.view.View!);
     method public void addView(android.view.View!, int);
     method public void assertInLayoutOrScroll(String!);
-    method public void assertNotInLayoutOrScroll(String?);
+    method public void assertNotInLayoutOrScroll(String!);
     method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public void attachView(android.view.View, int);
     method public void attachView(android.view.View);
@@ -655,8 +655,8 @@
     method public boolean canScrollVertically();
     method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public static int chooseSize(int, int, int);
-    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
     method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
@@ -671,7 +671,7 @@
     method public void endAnimation(android.view.View!);
     method public android.view.View? findContainingItemView(android.view.View);
     method public android.view.View? findViewByPosition(int);
-    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
     method public int getBaseline();
@@ -734,7 +734,7 @@
     method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
     method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
     method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
-    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
     method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
     method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
@@ -747,12 +747,12 @@
     method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
-    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
     method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
     method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
     method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
-    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
     method public android.os.Parcelable? onSaveInstanceState();
     method public void onScrollStateChanged(int);
     method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
@@ -770,15 +770,15 @@
     method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
     method public void requestLayout();
     method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method @Deprecated public void setAutoMeasureEnabled(boolean);
     method public final void setItemPrefetchEnabled(boolean);
     method public void setMeasuredDimension(android.graphics.Rect!, int, int);
     method public void setMeasuredDimension(int, int);
     method public void setMeasurementCacheEnabled(boolean);
-    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
     method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
     method public void stopIgnoringView(android.view.View);
     method public boolean supportsPredictiveItemAnimations();
@@ -957,21 +957,21 @@
 
   public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
     ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
     method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
-    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean getSupportsChangeAnimations();
     method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
@@ -989,11 +989,11 @@
     ctor public SnapHelper();
     method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
     method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public int[] calculateScrollDistance(int, int);
+    method public int[]! calculateScrollDistance(int, int);
     method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
     method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
     method public boolean onFling(int, int);
   }
 
@@ -1021,7 +1021,7 @@
   }
 
   public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>);
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
     method public boolean areContentsTheSame(T2!, T2!);
     method public boolean areItemsTheSame(T2!, T2!);
     method public int compare(T2!, T2!);
@@ -1039,11 +1039,11 @@
     method public abstract int compare(T2!, T2!);
     method public Object? getChangePayload(T2!, T2!);
     method public abstract void onChanged(int, int);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
   }
 
   public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>);
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
     method public void onChanged(int, int);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
diff --git a/recyclerview/recyclerview/api/public_plus_experimental_current.txt b/recyclerview/recyclerview/api/public_plus_experimental_current.txt
index ba238e0..7e45fbb 100644
--- a/recyclerview/recyclerview/api/public_plus_experimental_current.txt
+++ b/recyclerview/recyclerview/api/public_plus_experimental_current.txt
@@ -3,7 +3,7 @@
 
   public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -64,7 +64,7 @@
   public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
     method public void dispatchLastEvent();
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -110,11 +110,11 @@
 
   public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
     ctor public DefaultItemAnimator();
-    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
-    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public void endAnimations();
     method public boolean isRunning();
     method public void runPendingAnimations();
@@ -150,7 +150,7 @@
   }
 
   public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
-    ctor public DividerItemDecoration(android.content.Context, int);
+    ctor public DividerItemDecoration(android.content.Context!, int);
     method public android.graphics.drawable.Drawable? getDrawable();
     method public void setDrawable(android.graphics.drawable.Drawable);
     method public void setOrientation(int);
@@ -224,7 +224,7 @@
   public abstract static class ItemTouchHelper.Callback {
     ctor public ItemTouchHelper.Callback();
     method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
     method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public int convertToAbsoluteDirection(int, int);
     method public static int convertToRelativeDirection(int, int);
@@ -242,7 +242,7 @@
     method public static int makeFlag(int, int);
     method public static int makeMovementFlags(int, int);
     method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
     method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
     method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
@@ -265,23 +265,23 @@
   }
 
   public interface ItemTouchUIUtil {
-    method public void clearView(android.view.View);
-    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onSelected(android.view.View);
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
   }
 
   public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
     ctor public LinearLayoutManager(android.content.Context!);
     ctor public LinearLayoutManager(android.content.Context!, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
     method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
-    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
     method public int findFirstCompletelyVisibleItemPosition();
     method public int findFirstVisibleItemPosition();
     method public int findLastCompletelyVisibleItemPosition();
     method public int findLastVisibleItemPosition();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
     method public int getInitialPrefetchItemCount();
     method public int getOrientation();
@@ -312,20 +312,20 @@
   }
 
   public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
+    ctor public LinearSmoothScroller(android.content.Context!);
     method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
     method protected int calculateTimeForDeceleration(int);
     method protected int calculateTimeForScrolling(int);
     method protected int getHorizontalSnapPreference();
     method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     method protected void onStart();
     method protected void onStop();
-    method protected void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     field public static final int SNAP_TO_ANY = 0; // 0x0
     field public static final int SNAP_TO_END = 1; // 0x1
     field public static final int SNAP_TO_START = -1; // 0xffffffff
@@ -333,7 +333,7 @@
     field protected int mInterimTargetDx;
     field protected int mInterimTargetDy;
     field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
-    field protected android.graphics.PointF? mTargetVector;
+    field protected android.graphics.PointF! mTargetVector;
   }
 
   public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
@@ -391,8 +391,8 @@
   public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
     ctor public PagerSnapHelper();
     method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
   }
 
   public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
@@ -646,7 +646,7 @@
     method public void addView(android.view.View!);
     method public void addView(android.view.View!, int);
     method public void assertInLayoutOrScroll(String!);
-    method public void assertNotInLayoutOrScroll(String?);
+    method public void assertNotInLayoutOrScroll(String!);
     method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public void attachView(android.view.View, int);
     method public void attachView(android.view.View);
@@ -655,8 +655,8 @@
     method public boolean canScrollVertically();
     method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public static int chooseSize(int, int, int);
-    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
     method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
@@ -671,7 +671,7 @@
     method public void endAnimation(android.view.View!);
     method public android.view.View? findContainingItemView(android.view.View);
     method public android.view.View? findViewByPosition(int);
-    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
     method public int getBaseline();
@@ -734,7 +734,7 @@
     method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
     method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
     method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
-    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
     method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
     method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
@@ -747,12 +747,12 @@
     method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
-    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
     method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
     method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
     method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
-    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
     method public android.os.Parcelable? onSaveInstanceState();
     method public void onScrollStateChanged(int);
     method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
@@ -770,15 +770,15 @@
     method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
     method public void requestLayout();
     method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method @Deprecated public void setAutoMeasureEnabled(boolean);
     method public final void setItemPrefetchEnabled(boolean);
     method public void setMeasuredDimension(android.graphics.Rect!, int, int);
     method public void setMeasuredDimension(int, int);
     method public void setMeasurementCacheEnabled(boolean);
-    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
     method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
     method public void stopIgnoringView(android.view.View);
     method public boolean supportsPredictiveItemAnimations();
@@ -957,21 +957,21 @@
 
   public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
     ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
     method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
-    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean getSupportsChangeAnimations();
     method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
@@ -989,11 +989,11 @@
     ctor public SnapHelper();
     method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
     method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public int[] calculateScrollDistance(int, int);
+    method public int[]! calculateScrollDistance(int, int);
     method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
     method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
     method public boolean onFling(int, int);
   }
 
@@ -1021,7 +1021,7 @@
   }
 
   public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>);
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
     method public boolean areContentsTheSame(T2!, T2!);
     method public boolean areItemsTheSame(T2!, T2!);
     method public int compare(T2!, T2!);
@@ -1039,11 +1039,11 @@
     method public abstract int compare(T2!, T2!);
     method public Object? getChangePayload(T2!, T2!);
     method public abstract void onChanged(int, int);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
   }
 
   public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>);
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
     method public void onChanged(int, int);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
diff --git a/recyclerview/recyclerview/api/restricted_1.3.0-beta02.txt b/recyclerview/recyclerview/api/restricted_1.3.0-beta02.txt
index 4086071..ac7b64b 100644
--- a/recyclerview/recyclerview/api/restricted_1.3.0-beta02.txt
+++ b/recyclerview/recyclerview/api/restricted_1.3.0-beta02.txt
@@ -3,7 +3,7 @@
 
   public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -64,7 +64,7 @@
   public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
     method public void dispatchLastEvent();
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -110,11 +110,11 @@
 
   public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
     ctor public DefaultItemAnimator();
-    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
-    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public void endAnimations();
     method public boolean isRunning();
     method public void runPendingAnimations();
@@ -150,7 +150,7 @@
   }
 
   public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
-    ctor public DividerItemDecoration(android.content.Context, int);
+    ctor public DividerItemDecoration(android.content.Context!, int);
     method public android.graphics.drawable.Drawable? getDrawable();
     method public void setDrawable(android.graphics.drawable.Drawable);
     method public void setOrientation(int);
@@ -224,7 +224,7 @@
   public abstract static class ItemTouchHelper.Callback {
     ctor public ItemTouchHelper.Callback();
     method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
     method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public int convertToAbsoluteDirection(int, int);
     method public static int convertToRelativeDirection(int, int);
@@ -242,7 +242,7 @@
     method public static int makeFlag(int, int);
     method public static int makeMovementFlags(int, int);
     method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
     method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
     method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
@@ -265,23 +265,23 @@
   }
 
   public interface ItemTouchUIUtil {
-    method public void clearView(android.view.View);
-    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onSelected(android.view.View);
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
   }
 
   public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
     ctor public LinearLayoutManager(android.content.Context!);
     ctor public LinearLayoutManager(android.content.Context!, @androidx.recyclerview.widget.RecyclerView.Orientation int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
     method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
-    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
     method public int findFirstCompletelyVisibleItemPosition();
     method public int findFirstVisibleItemPosition();
     method public int findLastCompletelyVisibleItemPosition();
     method public int findLastVisibleItemPosition();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
     method public int getInitialPrefetchItemCount();
     method @androidx.recyclerview.widget.RecyclerView.Orientation public int getOrientation();
@@ -312,20 +312,20 @@
   }
 
   public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
+    ctor public LinearSmoothScroller(android.content.Context!);
     method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
     method protected int calculateTimeForDeceleration(int);
     method protected int calculateTimeForScrolling(int);
     method protected int getHorizontalSnapPreference();
     method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     method protected void onStart();
     method protected void onStop();
-    method protected void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     field public static final int SNAP_TO_ANY = 0; // 0x0
     field public static final int SNAP_TO_END = 1; // 0x1
     field public static final int SNAP_TO_START = -1; // 0xffffffff
@@ -333,7 +333,7 @@
     field protected int mInterimTargetDx;
     field protected int mInterimTargetDy;
     field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
-    field protected android.graphics.PointF? mTargetVector;
+    field protected android.graphics.PointF! mTargetVector;
   }
 
   public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
@@ -391,8 +391,8 @@
   public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
     ctor public PagerSnapHelper();
     method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
   }
 
   public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
@@ -646,7 +646,7 @@
     method public void addView(android.view.View!);
     method public void addView(android.view.View!, int);
     method public void assertInLayoutOrScroll(String!);
-    method public void assertNotInLayoutOrScroll(String?);
+    method public void assertNotInLayoutOrScroll(String!);
     method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public void attachView(android.view.View, int);
     method public void attachView(android.view.View);
@@ -655,8 +655,8 @@
     method public boolean canScrollVertically();
     method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public static int chooseSize(int, int, int);
-    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
     method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
@@ -671,7 +671,7 @@
     method public void endAnimation(android.view.View!);
     method public android.view.View? findContainingItemView(android.view.View);
     method public android.view.View? findViewByPosition(int);
-    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
     method public int getBaseline();
@@ -734,7 +734,7 @@
     method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
     method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
     method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
-    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
     method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
     method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
@@ -747,12 +747,12 @@
     method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
-    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
     method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
     method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
     method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
-    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
     method public android.os.Parcelable? onSaveInstanceState();
     method public void onScrollStateChanged(int);
     method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
@@ -770,15 +770,15 @@
     method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
     method public void requestLayout();
     method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method @Deprecated public void setAutoMeasureEnabled(boolean);
     method public final void setItemPrefetchEnabled(boolean);
     method public void setMeasuredDimension(android.graphics.Rect!, int, int);
     method public void setMeasuredDimension(int, int);
     method public void setMeasurementCacheEnabled(boolean);
-    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
     method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
     method public void stopIgnoringView(android.view.View);
     method public boolean supportsPredictiveItemAnimations();
@@ -960,21 +960,21 @@
 
   public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
     ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
     method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
-    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean getSupportsChangeAnimations();
     method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
@@ -992,11 +992,11 @@
     ctor public SnapHelper();
     method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
     method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public int[] calculateScrollDistance(int, int);
+    method public int[]! calculateScrollDistance(int, int);
     method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
     method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
     method public boolean onFling(int, int);
   }
 
@@ -1024,7 +1024,7 @@
   }
 
   public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>);
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
     method public boolean areContentsTheSame(T2!, T2!);
     method public boolean areItemsTheSame(T2!, T2!);
     method public int compare(T2!, T2!);
@@ -1042,11 +1042,11 @@
     method public abstract int compare(T2!, T2!);
     method public Object? getChangePayload(T2!, T2!);
     method public abstract void onChanged(int, int);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
   }
 
   public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>);
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
     method public void onChanged(int, int);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
diff --git a/recyclerview/recyclerview/api/restricted_current.ignore b/recyclerview/recyclerview/api/restricted_current.ignore
index de0ee4c..f5042d6 100644
--- a/recyclerview/recyclerview/api/restricted_current.ignore
+++ b/recyclerview/recyclerview/api/restricted_current.ignore
@@ -1,5 +1,135 @@
 // Baseline format: 1.0
+InvalidNullConversion: androidx.recyclerview.widget.AdapterListUpdateCallback#onChanged(int, int, Object) parameter #2:
+    Attempted to remove @Nullable annotation from parameter arg3 in androidx.recyclerview.widget.AdapterListUpdateCallback.onChanged(int arg1, int arg2, Object arg3)
+InvalidNullConversion: androidx.recyclerview.widget.BatchingListUpdateCallback#onChanged(int, int, Object) parameter #2:
+    Attempted to remove @Nullable annotation from parameter arg3 in androidx.recyclerview.widget.BatchingListUpdateCallback.onChanged(int arg1, int arg2, Object arg3)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #1:
+    Attempted to remove @Nullable annotation from parameter arg2 in androidx.recyclerview.widget.DefaultItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, int arg2, int arg3, int arg4, int arg5)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.DefaultItemAnimator#endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DefaultItemAnimator.endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.DividerItemDecoration#DividerItemDecoration(android.content.Context, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.DividerItemDecoration(android.content.Context arg1, int arg2)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchHelper.Callback#chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder>, int, int):
+    Attempted to remove @Nullable annotation from method androidx.recyclerview.widget.ItemTouchHelper.Callback.chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder,java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder>,int,int)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchHelper.Callback#onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.ItemTouchHelper.Callback.onChildDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, androidx.recyclerview.widget.RecyclerView.ViewHolder arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#clearView(android.view.View) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.clearView(android.view.View arg1)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.onDraw(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.ItemTouchUIUtil.onDraw(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.ItemTouchUIUtil.onDraw(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.onDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.ItemTouchUIUtil.onDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.ItemTouchUIUtil.onDrawOver(android.graphics.Canvas arg1, androidx.recyclerview.widget.RecyclerView arg2, android.view.View arg3, float arg4, float arg5, int arg6, boolean arg7)
+InvalidNullConversion: androidx.recyclerview.widget.ItemTouchUIUtil#onSelected(android.view.View) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.ItemTouchUIUtil.onSelected(android.view.View arg1)
 InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context) parameter #0:
     Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1, android.util.AttributeSet arg2, int arg3, int arg4)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int) parameter #1:
+    Attempted to remove @Nullable annotation from parameter arg2 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1, android.util.AttributeSet arg2, int arg3, int arg4)
 InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#LinearLayoutManager(android.content.Context, int, boolean) parameter #0:
     Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearLayoutManager(android.content.Context arg1, int arg2, boolean arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#computeScrollVectorForPosition(int):
+    Attempted to remove @Nullable annotation from method androidx.recyclerview.widget.LinearLayoutManager.computeScrollVectorForPosition(int)
+InvalidNullConversion: androidx.recyclerview.widget.LinearLayoutManager#generateDefaultLayoutParams():
+    Attempted to remove @NonNull annotation from method androidx.recyclerview.widget.LinearLayoutManager.generateDefaultLayoutParams()
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#LinearSmoothScroller(android.content.Context) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller(android.content.Context arg1)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#calculateDxToMakeVisible(android.view.View, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.calculateDxToMakeVisible(android.view.View arg1, int arg2)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#calculateDyToMakeVisible(android.view.View, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.calculateDyToMakeVisible(android.view.View arg1, int arg2)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#calculateSpeedPerPixel(android.util.DisplayMetrics) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.calculateSpeedPerPixel(android.util.DisplayMetrics arg1)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#mTargetVector:
+    Attempted to remove @Nullable annotation from field androidx.recyclerview.widget.LinearSmoothScroller.mTargetVector
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.LinearSmoothScroller.onSeekTargetStep(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg4)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #3:
+    Attempted to remove @NonNull annotation from parameter arg4 in androidx.recyclerview.widget.LinearSmoothScroller.onSeekTargetStep(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg4)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.onTargetFound(android.view.View arg1, androidx.recyclerview.widget.RecyclerView.State arg2, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.LinearSmoothScroller.onTargetFound(android.view.View arg1, androidx.recyclerview.widget.RecyclerView.State arg2, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.LinearSmoothScroller.onTargetFound(android.view.View arg1, androidx.recyclerview.widget.RecyclerView.State arg2, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg3)
+InvalidNullConversion: androidx.recyclerview.widget.LinearSmoothScroller#updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.LinearSmoothScroller.updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action arg1)
+InvalidNullConversion: androidx.recyclerview.widget.PagerSnapHelper#findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.PagerSnapHelper.findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1)
+InvalidNullConversion: androidx.recyclerview.widget.PagerSnapHelper#findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.PagerSnapHelper.findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1, int arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#assertNotInLayoutOrScroll(String) parameter #0:
+    Attempted to remove @Nullable annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.assertNotInLayoutOrScroll(String arg1)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.RecyclerView.LayoutManager.collectAdjacentPrefetchPositions(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry arg4)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry) parameter #3:
+    Attempted to remove @NonNull annotation from parameter arg4 in androidx.recyclerview.widget.RecyclerView.LayoutManager.collectAdjacentPrefetchPositions(int arg1, int arg2, androidx.recyclerview.widget.RecyclerView.State arg3, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry arg4)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.collectInitialPrefetchPositions(int arg1, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#generateDefaultLayoutParams():
+    Attempted to remove @NonNull annotation from method androidx.recyclerview.widget.RecyclerView.LayoutManager.generateDefaultLayoutParams()
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler arg1, androidx.recyclerview.widget.RecyclerView.State arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler arg1, androidx.recyclerview.widget.RecyclerView.State arg2)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State arg1)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#onRestoreInstanceState(android.os.Parcelable) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.onRestoreInstanceState(android.os.Parcelable arg1)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollHorizontallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollHorizontallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollVerticallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State) parameter #2:
+    Attempted to remove @NonNull annotation from parameter arg3 in androidx.recyclerview.widget.RecyclerView.LayoutManager.scrollVerticallyBy(int arg1, androidx.recyclerview.widget.RecyclerView.Recycler arg2, androidx.recyclerview.widget.RecyclerView.State arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.RecyclerView.LayoutManager.smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.State arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.RecyclerView.LayoutManager#smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int) parameter #1:
+    Attempted to remove @NonNull annotation from parameter arg2 in androidx.recyclerview.widget.RecyclerView.LayoutManager.smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView arg1, androidx.recyclerview.widget.RecyclerView.State arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #1:
+    Attempted to remove @Nullable annotation from parameter arg2 in androidx.recyclerview.widget.SimpleItemAnimator.animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, androidx.recyclerview.widget.RecyclerView.ViewHolder arg2, int arg3, int arg4, int arg5, int arg6)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1, int arg2, int arg3, int arg4, int arg5)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SimpleItemAnimator#dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SimpleItemAnimator.dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SnapHelper#calculateScrollDistance(int, int):
+    Attempted to remove @NonNull annotation from method androidx.recyclerview.widget.SnapHelper.calculateScrollDistance(int,int)
+InvalidNullConversion: androidx.recyclerview.widget.SnapHelper#findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SnapHelper.findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SnapHelper#findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SnapHelper.findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager arg1, int arg2, int arg3)
+InvalidNullConversion: androidx.recyclerview.widget.SortedList.BatchedCallback#BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2>) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2> arg1)
+InvalidNullConversion: androidx.recyclerview.widget.SortedList.Callback#onChanged(int, int, Object) parameter #2:
+    Attempted to remove @Nullable annotation from parameter arg3 in androidx.recyclerview.widget.SortedList.Callback.onChanged(int arg1, int arg2, Object arg3)
+InvalidNullConversion: androidx.recyclerview.widget.SortedListAdapterCallback#SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>) parameter #0:
+    Attempted to remove @NonNull annotation from parameter arg1 in androidx.recyclerview.widget.SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?> arg1)
diff --git a/recyclerview/recyclerview/api/restricted_current.txt b/recyclerview/recyclerview/api/restricted_current.txt
index 4086071..ac7b64b 100644
--- a/recyclerview/recyclerview/api/restricted_current.txt
+++ b/recyclerview/recyclerview/api/restricted_current.txt
@@ -3,7 +3,7 @@
 
   public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -64,7 +64,7 @@
   public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
     ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
     method public void dispatchLastEvent();
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
     method public void onRemoved(int, int);
@@ -110,11 +110,11 @@
 
   public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
     ctor public DefaultItemAnimator();
-    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
-    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public void endAnimations();
     method public boolean isRunning();
     method public void runPendingAnimations();
@@ -150,7 +150,7 @@
   }
 
   public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
-    ctor public DividerItemDecoration(android.content.Context, int);
+    ctor public DividerItemDecoration(android.content.Context!, int);
     method public android.graphics.drawable.Drawable? getDrawable();
     method public void setDrawable(android.graphics.drawable.Drawable);
     method public void setOrientation(int);
@@ -224,7 +224,7 @@
   public abstract static class ItemTouchHelper.Callback {
     ctor public ItemTouchHelper.Callback();
     method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
-    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
     method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public int convertToAbsoluteDirection(int, int);
     method public static int convertToRelativeDirection(int, int);
@@ -242,7 +242,7 @@
     method public static int makeFlag(int, int);
     method public static int makeMovementFlags(int, int);
     method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
     method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
     method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
     method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
@@ -265,23 +265,23 @@
   }
 
   public interface ItemTouchUIUtil {
-    method public void clearView(android.view.View);
-    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public void onSelected(android.view.View);
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
   }
 
   public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
     ctor public LinearLayoutManager(android.content.Context!);
     ctor public LinearLayoutManager(android.content.Context!, @androidx.recyclerview.widget.RecyclerView.Orientation int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet?, int, int);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
     method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
-    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
     method public int findFirstCompletelyVisibleItemPosition();
     method public int findFirstVisibleItemPosition();
     method public int findLastCompletelyVisibleItemPosition();
     method public int findLastVisibleItemPosition();
-    method public androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
     method public int getInitialPrefetchItemCount();
     method @androidx.recyclerview.widget.RecyclerView.Orientation public int getOrientation();
@@ -312,20 +312,20 @@
   }
 
   public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
+    ctor public LinearSmoothScroller(android.content.Context!);
     method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
     method protected int calculateTimeForDeceleration(int);
     method protected int calculateTimeForScrolling(int);
     method protected int getHorizontalSnapPreference();
     method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     method protected void onStart();
     method protected void onStop();
-    method protected void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
     field public static final int SNAP_TO_ANY = 0; // 0x0
     field public static final int SNAP_TO_END = 1; // 0x1
     field public static final int SNAP_TO_START = -1; // 0xffffffff
@@ -333,7 +333,7 @@
     field protected int mInterimTargetDx;
     field protected int mInterimTargetDy;
     field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
-    field protected android.graphics.PointF? mTargetVector;
+    field protected android.graphics.PointF! mTargetVector;
   }
 
   public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
@@ -391,8 +391,8 @@
   public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
     ctor public PagerSnapHelper();
     method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
   }
 
   public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
@@ -646,7 +646,7 @@
     method public void addView(android.view.View!);
     method public void addView(android.view.View!, int);
     method public void assertInLayoutOrScroll(String!);
-    method public void assertNotInLayoutOrScroll(String?);
+    method public void assertNotInLayoutOrScroll(String!);
     method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public void attachView(android.view.View, int);
     method public void attachView(android.view.View);
@@ -655,8 +655,8 @@
     method public boolean canScrollVertically();
     method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
     method public static int chooseSize(int, int, int);
-    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
-    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
     method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
     method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
@@ -671,7 +671,7 @@
     method public void endAnimation(android.view.View!);
     method public android.view.View? findContainingItemView(android.view.View);
     method public android.view.View? findViewByPosition(int);
-    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
     method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
     method public int getBaseline();
@@ -734,7 +734,7 @@
     method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
     method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
     method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
-    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
     method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
     method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
     method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
@@ -747,12 +747,12 @@
     method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
     method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
-    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
-    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
     method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
     method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
     method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
-    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
     method public android.os.Parcelable? onSaveInstanceState();
     method public void onScrollStateChanged(int);
     method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
@@ -770,15 +770,15 @@
     method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
     method public void requestLayout();
     method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
     method @Deprecated public void setAutoMeasureEnabled(boolean);
     method public final void setItemPrefetchEnabled(boolean);
     method public void setMeasuredDimension(android.graphics.Rect!, int, int);
     method public void setMeasuredDimension(int, int);
     method public void setMeasurementCacheEnabled(boolean);
-    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, int);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
     method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
     method public void stopIgnoringView(android.view.View);
     method public boolean supportsPredictiveItemAnimations();
@@ -960,21 +960,21 @@
 
   public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
     ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
     method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder?, int, int, int, int);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
-    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
     method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
     method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
-    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
     method public boolean getSupportsChangeAnimations();
     method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
@@ -992,11 +992,11 @@
     ctor public SnapHelper();
     method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
     method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
-    method public int[] calculateScrollDistance(int, int);
+    method public int[]! calculateScrollDistance(int, int);
     method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
     method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager);
-    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager, int, int);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
     method public boolean onFling(int, int);
   }
 
@@ -1024,7 +1024,7 @@
   }
 
   public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>);
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
     method public boolean areContentsTheSame(T2!, T2!);
     method public boolean areItemsTheSame(T2!, T2!);
     method public int compare(T2!, T2!);
@@ -1042,11 +1042,11 @@
     method public abstract int compare(T2!, T2!);
     method public Object? getChangePayload(T2!, T2!);
     method public abstract void onChanged(int, int);
-    method public void onChanged(int, int, Object?);
+    method public void onChanged(int, int, Object!);
   }
 
   public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
-    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>);
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter<?>!);
     method public void onChanged(int, int);
     method public void onInserted(int, int);
     method public void onMoved(int, int);
diff --git a/recyclerview/recyclerview/lint-baseline.xml b/recyclerview/recyclerview/lint-baseline.xml
index f4df0f4..ea6b005c 100644
--- a/recyclerview/recyclerview/lint-baseline.xml
+++ b/recyclerview/recyclerview/lint-baseline.xml
@@ -760,114 +760,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 LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {"
-        errorLine2="               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 LayoutParams generateLayoutParams(Context c, AttributeSet attrs) {"
-        errorLine2="               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 LayoutParams generateLayoutParams(Context c, AttributeSet attrs) {"
-        errorLine2="                                                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 LayoutParams generateLayoutParams(Context c, AttributeSet attrs) {"
-        errorLine2="                                                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 startSmoothScroll(SmoothScroller smoothScroller) {"
-        errorLine2="                                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 endAnimation(View view) {"
-        errorLine2="                                 ~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 addDisappearingView(View child) {"
-        errorLine2="                                        ~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 addDisappearingView(View child, int index) {"
-        errorLine2="                                        ~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 addView(View child) {"
-        errorLine2="                            ~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 addView(View child, int index) {"
-        errorLine2="                            ~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 removeView(View child) {"
-        errorLine2="                               ~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/RecyclerView.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 attachView(@NonNull View child, int index, LayoutParams lp) {"
         errorLine2="                                                               ~~~~~~~~~~~~">
         <location
@@ -1039,141 +931,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 final void dispatchMoveFinished(RecyclerView.ViewHolder item) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 final void dispatchAddFinished(RecyclerView.ViewHolder item) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 final void dispatchChangeFinished(RecyclerView.ViewHolder item, boolean oldItem) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 final void dispatchRemoveStarting(RecyclerView.ViewHolder item) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 final void dispatchMoveStarting(RecyclerView.ViewHolder item) {"
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 final void dispatchAddStarting(RecyclerView.ViewHolder item) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 final void dispatchChangeStarting(RecyclerView.ViewHolder item, boolean oldItem) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onRemoveStarting(RecyclerView.ViewHolder item) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onRemoveFinished(RecyclerView.ViewHolder item) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onAddStarting(RecyclerView.ViewHolder item) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onAddFinished(RecyclerView.ViewHolder item) {"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onMoveStarting(RecyclerView.ViewHolder item) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onMoveFinished(RecyclerView.ViewHolder item) {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onChangeStarting(RecyclerView.ViewHolder item, boolean oldItem) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 onChangeFinished(RecyclerView.ViewHolder item, boolean oldItem) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.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 StaggeredGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,"
         errorLine2="                                      ~~~~~~~">
         <location
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AdapterListUpdateCallback.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AdapterListUpdateCallback.java
index 951e06d..ec94f9c 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AdapterListUpdateCallback.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/AdapterListUpdateCallback.java
@@ -16,8 +16,9 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
+
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 /**
  * ListUpdateCallback that dispatches update events to the given adapter.
@@ -57,7 +58,8 @@
 
     /** {@inheritDoc} */
     @Override
-    public void onChanged(int position, int count, @Nullable Object payload) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onChanged(int position, int count, Object payload) {
         mAdapter.notifyItemRangeChanged(position, count, payload);
     }
 }
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/BatchingListUpdateCallback.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/BatchingListUpdateCallback.java
index f227a02..bad8cc9 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/BatchingListUpdateCallback.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/BatchingListUpdateCallback.java
@@ -15,8 +15,9 @@
  */
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
+
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 /**
  * Wraps a {@link ListUpdateCallback} callback and batches operations that can be merged.
@@ -107,7 +108,8 @@
     }
 
     @Override
-    public void onChanged(int position, int count, @Nullable Object payload) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onChanged(int position, int count, Object payload) {
         if (mLastEventType == TYPE_CHANGE &&
                 !(position > mLastEventPosition + mLastEventCount
                         || position + count < mLastEventPosition || mLastEventPayload != payload)) {
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java
index 3af73bc..a520aa9 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DefaultItemAnimator.java
@@ -19,11 +19,11 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.TimeInterpolator;
 import android.animation.ValueAnimator;
+import android.annotation.SuppressLint;
 import android.view.View;
 import android.view.ViewPropertyAnimator;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.core.view.ViewCompat;
 
 import java.util.ArrayList;
@@ -85,8 +85,8 @@
             this.toY = toY;
         }
 
-        @NonNull
         @Override
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public String toString() {
             return "ChangeInfo{"
                     + "oldHolder=" + oldHolder
@@ -191,7 +191,8 @@
     }
 
     @Override
-    public boolean animateRemove(@NonNull final RecyclerView.ViewHolder holder) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public boolean animateRemove(final RecyclerView.ViewHolder holder) {
         resetAnimation(holder);
         mPendingRemovals.add(holder);
         return true;
@@ -220,7 +221,8 @@
     }
 
     @Override
-    public boolean animateAdd(@NonNull final RecyclerView.ViewHolder holder) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public boolean animateAdd(final RecyclerView.ViewHolder holder) {
         resetAnimation(holder);
         holder.itemView.setAlpha(0);
         mPendingAdditions.add(holder);
@@ -254,7 +256,8 @@
     }
 
     @Override
-    public boolean animateMove(@NonNull final RecyclerView.ViewHolder holder, int fromX, int fromY,
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY,
             int toX, int toY) {
         final View view = holder.itemView;
         fromX += (int) holder.itemView.getTranslationX();
@@ -318,9 +321,9 @@
     }
 
     @Override
-    public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder,
-            @Nullable RecyclerView.ViewHolder newHolder,
-            int fromLeft, int fromTop, int toLeft, int toTop) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public boolean animateChange(RecyclerView.ViewHolder oldHolder,
+            RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) {
         if (oldHolder == newHolder) {
             // Don't know how to run change animations when the same view holder is re-used.
             // run a move animation to handle position changes.
@@ -436,7 +439,8 @@
     }
 
     @Override
-    public void endAnimation(@NonNull RecyclerView.ViewHolder item) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void endAnimation(RecyclerView.ViewHolder item) {
         final View view = item.itemView;
         // this will trigger end callback which should set properties to their target values.
         view.animate().cancel();
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DividerItemDecoration.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DividerItemDecoration.java
index f54070b..b4598ed 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DividerItemDecoration.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/DividerItemDecoration.java
@@ -17,6 +17,7 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
@@ -63,7 +64,8 @@
      * @param context Current context, it will be used to access resources.
      * @param orientation Divider orientation. Should be {@link #HORIZONTAL} or {@link #VERTICAL}.
      */
-    public DividerItemDecoration(@NonNull Context context, int orientation) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public DividerItemDecoration(Context context, int orientation) {
         final TypedArray a = context.obtainStyledAttributes(ATTRS);
         mDivider = a.getDrawable(0);
         if (mDivider == null) {
@@ -109,8 +111,8 @@
     }
 
     @Override
-    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent,
-            @NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
         if (parent.getLayoutManager() == null || mDivider == null) {
             return;
         }
@@ -176,8 +178,9 @@
     }
 
     @Override
-    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
-            @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+            RecyclerView.State state) {
         if (mDivider == null) {
             outRect.set(0, 0, 0, 0);
             return;
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
index b32fdbd..2865dad 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchHelper.java
@@ -18,6 +18,7 @@
 
 import android.animation.Animator;
 import android.animation.ValueAnimator;
+import android.annotation.SuppressLint;
 import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.Rect;
@@ -556,8 +557,8 @@
     }
 
     @Override
-    public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent,
-            @NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
         // we don't know if RV changed something so we should invalidate this index.
         mOverdrawChildPosition = -1;
         float dx = 0, dy = 0;
@@ -935,8 +936,9 @@
     }
 
     @Override
-    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
-            @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+            RecyclerView.State state) {
         outRect.setEmpty();
     }
 
@@ -1806,7 +1808,7 @@
          * moved to.
          */
         @SuppressWarnings("WeakerAccess")
-        @Nullable
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public ViewHolder chooseDropTarget(@NonNull ViewHolder selected,
                 @NonNull List<ViewHolder> dropTargets, int curX, int curY) {
             int right = curX + selected.itemView.getWidth();
@@ -2110,7 +2112,8 @@
          * boolean)
          */
         public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
-                @NonNull ViewHolder viewHolder,
+                @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+                ViewHolder viewHolder,
                 float dX, float dY, int actionState, boolean isCurrentlyActive) {
             ItemTouchUIUtilImpl.INSTANCE.onDrawOver(c, recyclerView, viewHolder.itemView, dX, dY,
                     actionState, isCurrentlyActive);
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchUIUtil.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchUIUtil.java
index 443500e..8f4f8f0 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchUIUtil.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ItemTouchUIUtil.java
@@ -16,12 +16,10 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
 import android.graphics.Canvas;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-
-
 /**
  * Utility class for {@link ItemTouchHelper} which handles item transformations for different
  * API versions.
@@ -41,26 +39,30 @@
      * The default implementation for {@link ItemTouchHelper.Callback#onChildDraw(Canvas,
      * RecyclerView, RecyclerView.ViewHolder, float, float, int, boolean)}
      */
-    void onDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull View view,
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    void onDraw(Canvas c, RecyclerView recyclerView, View view,
             float dX, float dY, int actionState, boolean isCurrentlyActive);
 
     /**
      * The default implementation for {@link ItemTouchHelper.Callback#onChildDrawOver(Canvas,
      * RecyclerView, RecyclerView.ViewHolder, float, float, int, boolean)}
      */
-    void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull View view,
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    void onDrawOver(Canvas c, RecyclerView recyclerView, View view,
             float dX, float dY, int actionState, boolean isCurrentlyActive);
 
     /**
      * The default implementation for {@link ItemTouchHelper.Callback#clearView(RecyclerView,
      * RecyclerView.ViewHolder)}
      */
-    void clearView(@NonNull View view);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    void clearView(View view);
 
     /**
      * The default implementation for {@link ItemTouchHelper.Callback#onSelectedChanged(
      * RecyclerView.ViewHolder, int)}
      */
-    void onSelected(@NonNull View view);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    void onSelected(View view);
 }
 
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 771487a..22fd533 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
@@ -30,7 +30,6 @@
 import android.view.accessibility.AccessibilityEvent;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.os.TraceCompat;
 import androidx.core.view.ViewCompat;
@@ -189,12 +188,9 @@
      * {@link androidx.recyclerview.R.attr#reverseLayout}
      * {@link androidx.recyclerview.R.attr#stackFromEnd}
      */
-    public LinearLayoutManager(
-            @NonNull Context context,
-            @Nullable AttributeSet attrs,
-            int defStyleAttr,
-            int defStyleRes
-    ) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         Properties properties = getProperties(context, attrs, defStyleAttr, defStyleRes);
         setOrientation(properties.orientation);
         setReverseLayout(properties.reverseLayout);
@@ -209,8 +205,8 @@
     /**
      * {@inheritDoc}
      */
-    @NonNull
     @Override
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public RecyclerView.LayoutParams generateDefaultLayoutParams() {
         return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -245,10 +241,8 @@
     }
 
     @Override
-    public void onDetachedFromWindow(
-            @NonNull RecyclerView view,
-            @NonNull RecyclerView.Recycler recycler
-    ) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycler) {
         super.onDetachedFromWindow(view, recycler);
         if (mRecycleChildrenOnDetach) {
             removeAndRecycleAllViews(recycler);
@@ -257,7 +251,8 @@
     }
 
     @Override
-    public void onInitializeAccessibilityEvent(@NonNull AccessibilityEvent event) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
         super.onInitializeAccessibilityEvent(event);
         if (getChildCount() > 0) {
             event.setFromIndex(findFirstVisibleItemPosition());
@@ -265,8 +260,8 @@
         }
     }
 
-    @Nullable
     @Override
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public Parcelable onSaveInstanceState() {
         if (mPendingSavedState != null) {
             return new SavedState(mPendingSavedState);
@@ -294,7 +289,8 @@
     }
 
     @Override
-    public void onRestoreInstanceState(@NonNull Parcelable state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onRestoreInstanceState(Parcelable state) {
         if (state instanceof SavedState) {
             mPendingSavedState = (SavedState) state;
             if (mPendingScrollPosition != RecyclerView.NO_POSITION) {
@@ -424,8 +420,8 @@
     /**
      * {@inheritDoc}
      */
-    @Nullable
     @Override
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public View findViewByPosition(int position) {
         final int childCount = getChildCount();
         if (childCount == 0) {
@@ -520,19 +516,17 @@
     }
 
     @Override
-    public void smoothScrollToPosition(
-            @NonNull RecyclerView recyclerView,
-            @NonNull RecyclerView.State state,
-            int position
-    ) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
+            int position) {
         LinearSmoothScroller linearSmoothScroller =
                 new LinearSmoothScroller(recyclerView.getContext());
         linearSmoothScroller.setTargetPosition(position);
         startSmoothScroll(linearSmoothScroller);
     }
 
-    @Nullable
     @Override
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public PointF computeScrollVectorForPosition(int targetPosition) {
         if (getChildCount() == 0) {
             return null;
@@ -550,10 +544,8 @@
      * {@inheritDoc}
      */
     @Override
-    public void onLayoutChildren(
-            @NonNull RecyclerView.Recycler recycler,
-            @NonNull RecyclerView.State state
-    ) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
         // layout algorithm:
         // 1) by checking children and other variables, find an anchor coordinate and an anchor
         //  item position.
@@ -751,7 +743,8 @@
     }
 
     @Override
-    public void onLayoutCompleted(@NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onLayoutCompleted(RecyclerView.State state) {
         super.onLayoutCompleted(state);
         mPendingSavedState = null; // we don't need this anymore
         mPendingScrollPosition = RecyclerView.NO_POSITION;
@@ -1143,8 +1136,9 @@
      * {@inheritDoc}
      */
     @Override
-    public int scrollHorizontallyBy(int dx, @NonNull RecyclerView.Recycler recycler,
-            @NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler,
+            RecyclerView.State state) {
         if (mOrientation == VERTICAL) {
             return 0;
         }
@@ -1155,8 +1149,9 @@
      * {@inheritDoc}
      */
     @Override
-    public int scrollVerticallyBy(int dy, @NonNull RecyclerView.Recycler recycler,
-            @NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler,
+            RecyclerView.State state) {
         if (mOrientation == HORIZONTAL) {
             return 0;
         }
@@ -1164,32 +1159,38 @@
     }
 
     @Override
-    public int computeHorizontalScrollOffset(@NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int computeHorizontalScrollOffset(RecyclerView.State state) {
         return computeScrollOffset(state);
     }
 
     @Override
-    public int computeVerticalScrollOffset(@NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int computeVerticalScrollOffset(RecyclerView.State state) {
         return computeScrollOffset(state);
     }
 
     @Override
-    public int computeHorizontalScrollExtent(@NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int computeHorizontalScrollExtent(RecyclerView.State state) {
         return computeScrollExtent(state);
     }
 
     @Override
-    public int computeVerticalScrollExtent(@NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int computeVerticalScrollExtent(RecyclerView.State state) {
         return computeScrollExtent(state);
     }
 
     @Override
-    public int computeHorizontalScrollRange(@NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int computeHorizontalScrollRange(RecyclerView.State state) {
         return computeScrollRange(state);
     }
 
     @Override
-    public int computeVerticalScrollRange(@NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int computeVerticalScrollRange(RecyclerView.State state) {
         return computeScrollRange(state);
     }
 
@@ -1314,8 +1315,9 @@
     }
 
     @Override
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public void collectInitialPrefetchPositions(int adapterItemCount,
-            @NonNull LayoutPrefetchRegistry layoutPrefetchRegistry) {
+            LayoutPrefetchRegistry layoutPrefetchRegistry) {
         final boolean fromEnd;
         final int anchorPos;
         if (mPendingSavedState != null && mPendingSavedState.hasValidAnchor()) {
@@ -1394,8 +1396,9 @@
     }
 
     @Override
-    public void collectAdjacentPrefetchPositions(int dx, int dy, @NonNull RecyclerView.State state,
-            @NonNull LayoutPrefetchRegistry layoutPrefetchRegistry) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void collectAdjacentPrefetchPositions(int dx, int dy, RecyclerView.State state,
+            LayoutPrefetchRegistry layoutPrefetchRegistry) {
         int delta = (mOrientation == HORIZONTAL) ? dx : dy;
         if (getChildCount() == 0 || delta == 0) {
             // can't support this scroll, so don't bother prefetching
@@ -1436,7 +1439,8 @@
     }
 
     @Override
-    public void assertNotInLayoutOrScroll(@Nullable String message) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void assertNotInLayoutOrScroll(String message) {
         if (mPendingSavedState == null) {
             super.assertNotInLayoutOrScroll(message);
         }
@@ -2089,10 +2093,10 @@
                         acceptableBoundsFlag);
     }
 
-    @Nullable
     @Override
-    public View onFocusSearchFailed(@NonNull View focused, int direction,
-            @NonNull RecyclerView.Recycler recycler, @NonNull RecyclerView.State state) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public View onFocusSearchFailed(View focused, int direction,
+            RecyclerView.Recycler recycler, RecyclerView.State state) {
         resolveShouldLayoutReverse();
         if (getChildCount() == 0) {
             return null;
@@ -2457,7 +2461,8 @@
             mAnchorLayoutFromEnd = in.readInt() == 1;
         }
 
-        public SavedState(@NonNull SavedState other) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public SavedState(SavedState other) {
             mAnchorPosition = other.mAnchorPosition;
             mAnchorOffset = other.mAnchorOffset;
             mAnchorLayoutFromEnd = other.mAnchorLayoutFromEnd;
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java
index 335c9dd..b4ba75f 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearSmoothScroller.java
@@ -16,6 +16,7 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.graphics.PointF;
 import android.util.DisplayMetrics;
@@ -23,9 +24,6 @@
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.LinearInterpolator;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 /**
  * {@link RecyclerView.SmoothScroller} implementation which uses a {@link LinearInterpolator} until
  * the target position becomes a child of the RecyclerView and then uses a
@@ -83,7 +81,7 @@
 
     protected final DecelerateInterpolator mDecelerateInterpolator = new DecelerateInterpolator();
 
-    @Nullable
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     protected PointF mTargetVector;
 
     private final DisplayMetrics mDisplayMetrics;
@@ -94,7 +92,8 @@
     // point to a real item position, rather point to an estimated location pixels.
     protected int mInterimTargetDx = 0, mInterimTargetDy = 0;
 
-    public LinearSmoothScroller(@NonNull Context context) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public LinearSmoothScroller(Context context) {
         mDisplayMetrics = context.getResources().getDisplayMetrics();
     }
 
@@ -110,8 +109,8 @@
      * {@inheritDoc}
      */
     @Override
-    protected void onTargetFound(@NonNull View targetView,
-            @NonNull RecyclerView.State state, @NonNull Action action) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    protected void onTargetFound(View targetView, RecyclerView.State state, Action action) {
         final int dx = calculateDxToMakeVisible(targetView, getHorizontalSnapPreference());
         final int dy = calculateDyToMakeVisible(targetView, getVerticalSnapPreference());
         final int distance = (int) Math.sqrt(dx * dx + dy * dy);
@@ -125,8 +124,8 @@
      * {@inheritDoc}
      */
     @Override
-    protected void onSeekTargetStep(int dx, int dy, @NonNull RecyclerView.State state,
-            @NonNull Action action) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    protected void onSeekTargetStep(int dx, int dy, RecyclerView.State state, Action action) {
         // TODO(b/72745539): Is there ever a time when onSeekTargetStep should be called when
         // getChildCount returns 0?  Should this logic be extracted out of this method such that
         // this method is not called if getChildCount() returns 0?
@@ -168,7 +167,8 @@
      * @return The time (in ms) it should take for each pixel. For instance, if returned value is
      * 2 ms, it means scrolling 1000 pixels with LinearInterpolation should take 2 seconds.
      */
-    protected float calculateSpeedPerPixel(@NonNull DisplayMetrics displayMetrics) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
         return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
     }
 
@@ -245,7 +245,8 @@
      *
      * @see #computeScrollVectorForPosition(int)
      */
-    protected void updateActionForInterimTarget(@NonNull Action action) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    protected void updateActionForInterimTarget(Action action) {
         // find an interim target position
         PointF scrollVector = computeScrollVectorForPosition(getTargetPosition());
         if (scrollVector == null || (scrollVector.x == 0 && scrollVector.y == 0)) {
@@ -316,7 +317,8 @@
      * @return The vertical scroll amount necessary to make the view visible with the given
      * snap preference.
      */
-    public int calculateDyToMakeVisible(@NonNull View view, int snapPreference) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int calculateDyToMakeVisible(View view, int snapPreference) {
         final RecyclerView.LayoutManager layoutManager = getLayoutManager();
         if (layoutManager == null || !layoutManager.canScrollVertically()) {
             return 0;
@@ -341,7 +343,8 @@
      * @return The vertical scroll amount necessary to make the view visible with the given
      * snap preference.
      */
-    public int calculateDxToMakeVisible(@NonNull View view, int snapPreference) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int calculateDxToMakeVisible(View view, int snapPreference) {
         final RecyclerView.LayoutManager layoutManager = getLayoutManager();
         if (layoutManager == null || !layoutManager.canScrollHorizontally()) {
             return 0;
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/PagerSnapHelper.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/PagerSnapHelper.java
index 9610ecf..3d97cdf 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/PagerSnapHelper.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/PagerSnapHelper.java
@@ -16,6 +16,7 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
 import android.graphics.PointF;
 import android.util.DisplayMetrics;
 import android.view.View;
@@ -67,7 +68,8 @@
 
     @Nullable
     @Override
-    public View findSnapView(@NonNull RecyclerView.LayoutManager layoutManager) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public View findSnapView(RecyclerView.LayoutManager layoutManager) {
         if (layoutManager.canScrollVertically()) {
             return findCenterView(layoutManager, getVerticalHelper(layoutManager));
         } else if (layoutManager.canScrollHorizontally()) {
@@ -77,8 +79,9 @@
     }
 
     @Override
-    public int findTargetSnapPosition(@NonNull RecyclerView.LayoutManager layoutManager,
-            int velocityX, int velocityY) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX,
+            int velocityY) {
         final int itemCount = layoutManager.getItemCount();
         if (itemCount == 0) {
             return RecyclerView.NO_POSITION;
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 919e32c..df4de2d 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -8626,7 +8626,8 @@
          * @param message The message for the exception. Can be null.
          * @see #assertInLayoutOrScroll(String)
          */
-        public void assertNotInLayoutOrScroll(@Nullable String message) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void assertNotInLayoutOrScroll(String message) {
             if (mRecyclerView != null) {
                 mRecyclerView.assertNotInLayoutOrScroll(message);
             }
@@ -8805,8 +8806,9 @@
          * @see #isItemPrefetchEnabled()
          * @see #collectInitialPrefetchPositions(int, LayoutPrefetchRegistry)
          */
-        public void collectAdjacentPrefetchPositions(int dx, int dy, @NonNull State state,
-                @NonNull LayoutPrefetchRegistry layoutPrefetchRegistry) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void collectAdjacentPrefetchPositions(int dx, int dy, State state,
+                LayoutPrefetchRegistry layoutPrefetchRegistry) {
         }
 
         /**
@@ -8833,8 +8835,9 @@
          * @see #isItemPrefetchEnabled()
          * @see #collectAdjacentPrefetchPositions(int, int, State, LayoutPrefetchRegistry)
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void collectInitialPrefetchPositions(int adapterItemCount,
-                @NonNull LayoutPrefetchRegistry layoutPrefetchRegistry) {
+                LayoutPrefetchRegistry layoutPrefetchRegistry) {
         }
 
         void dispatchAttachedToWindow(RecyclerView view) {
@@ -8940,7 +8943,8 @@
          * @see #onAttachedToWindow(RecyclerView)
          */
         @CallSuper
-        public void onDetachedFromWindow(@NonNull RecyclerView view, @NonNull Recycler recycler) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void onDetachedFromWindow(RecyclerView view, Recycler recycler) {
             onDetachedFromWindow(view);
         }
 
@@ -9004,7 +9008,8 @@
          *                 position
          * @param state    Transient state of RecyclerView
          */
-        public void onLayoutChildren(@NonNull Recycler recycler, @NonNull State state) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void onLayoutChildren(Recycler recycler, State state) {
             Log.e(TAG, "You must override onLayoutChildren(Recycler recycler, State state) ");
         }
 
@@ -9019,7 +9024,8 @@
          *
          * @param state Transient state of RecyclerView
          */
-        public void onLayoutCompleted(@NonNull State state) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void onLayoutCompleted(State state) {
         }
 
         /**
@@ -9037,7 +9043,7 @@
          *
          * @return A new LayoutParams for a child view
          */
-        @NonNull
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public abstract LayoutParams generateDefaultLayoutParams();
 
         /**
@@ -9067,6 +9073,7 @@
          * @param lp Source LayoutParams object to copy values from
          * @return a new LayoutParams object
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
             if (lp instanceof LayoutParams) {
                 return new LayoutParams((LayoutParams) lp);
@@ -9091,6 +9098,7 @@
          * @param attrs AttributeSet describing the supplied arguments
          * @return a new LayoutParams object
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public LayoutParams generateLayoutParams(Context c, AttributeSet attrs) {
             return new LayoutParams(c, attrs);
         }
@@ -9108,7 +9116,8 @@
          * negative and scrolling proceeeded in that direction.
          * <code>Math.abs(result)</code> may be less than dx if a boundary was reached.
          */
-        public int scrollHorizontallyBy(int dx, @NonNull Recycler recycler, @NonNull State state) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public int scrollHorizontallyBy(int dx, Recycler recycler, State state) {
             return 0;
         }
 
@@ -9125,7 +9134,8 @@
          * negative and scrolling proceeeded in that direction.
          * <code>Math.abs(result)</code> may be less than dy if a boundary was reached.
          */
-        public int scrollVerticallyBy(int dy, @NonNull Recycler recycler, @NonNull State state) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public int scrollVerticallyBy(int dy, Recycler recycler, State state) {
             return 0;
         }
 
@@ -9172,11 +9182,9 @@
          * @param state        Current State of RecyclerView
          * @param position     Scroll to this adapter position.
          */
-        public void smoothScrollToPosition(
-                @NonNull RecyclerView recyclerView,
-                @NonNull State state,
-                int position
-        ) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void smoothScrollToPosition(RecyclerView recyclerView, State state,
+                int position) {
             Log.e(TAG, "You must override smoothScrollToPosition to support smooth scrolling");
         }
 
@@ -9190,6 +9198,7 @@
          *
          * @param smoothScroller Instance which defines how smooth scroll should be animated
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void startSmoothScroll(SmoothScroller smoothScroller) {
             if (mSmoothScroller != null && smoothScroller != mSmoothScroller
                     && mSmoothScroller.isRunning()) {
@@ -9224,6 +9233,7 @@
          * @param view The View for which the animations should be ended.
          * @see RecyclerView.ItemAnimator#endAnimations()
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void endAnimation(View view) {
             if (mRecyclerView.mItemAnimator != null) {
                 mRecyclerView.mItemAnimator.endAnimation(getChildViewHolderInt(view));
@@ -9243,6 +9253,7 @@
          *
          * @param child View to add and then remove with animation.
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void addDisappearingView(View child) {
             addDisappearingView(child, -1);
         }
@@ -9261,6 +9272,7 @@
          * @param child View to add and then remove with animation.
          * @param index Index of the view.
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void addDisappearingView(View child, int index) {
             addViewInt(child, index, true);
         }
@@ -9272,6 +9284,7 @@
          *
          * @param child View to add
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void addView(View child) {
             addView(child, -1);
         }
@@ -9284,6 +9297,7 @@
          * @param child View to add
          * @param index Index to add child at
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void addView(View child, int index) {
             addViewInt(child, index, false);
         }
@@ -9350,6 +9364,7 @@
          *
          * @param child View to remove
          */
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
         public void removeView(View child) {
             mChildHelper.removeView(child);
         }
@@ -11009,7 +11024,8 @@
          * @param state The parcelable that was returned by the previous LayoutManager's
          *              {@link #onSaveInstanceState()} method.
          */
-        public void onRestoreInstanceState(@NonNull Parcelable state) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void onRestoreInstanceState(Parcelable state) {
 
         }
 
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.java
index 804750f..4dc33c6 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SimpleItemAnimator.java
@@ -16,6 +16,7 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
 import android.util.Log;
 import android.view.View;
 
@@ -27,10 +28,10 @@
  * move, change, add or remove animations. This class also replicates the original ItemAnimator
  * API.
  * <p>
- * It uses {@link RecyclerView.ItemAnimator.ItemHolderInfo} to track the bounds information of the Views. If you would like
- * to
- * extend this class, you can override {@link #obtainHolderInfo()} method to provide your own info
- * class that extends {@link RecyclerView.ItemAnimator.ItemHolderInfo}.
+ * It uses {@link RecyclerView.ItemAnimator.ItemHolderInfo} to track the bounds information of
+ * the Views. If you would like to extend this class, you can override {@link #obtainHolderInfo()}
+ * method to provide your own info class that extends
+ * {@link RecyclerView.ItemAnimator.ItemHolderInfo}.
  */
 public abstract class SimpleItemAnimator extends RecyclerView.ItemAnimator {
 
@@ -185,7 +186,8 @@
      * @return true if a later call to {@link #runPendingAnimations()} is requested,
      * false otherwise.
      */
-    public abstract boolean animateRemove(@NonNull RecyclerView.ViewHolder holder);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public abstract boolean animateRemove(RecyclerView.ViewHolder holder);
 
     /**
      * Called when an item is added to the RecyclerView. Implementors can choose
@@ -210,7 +212,8 @@
      * @return true if a later call to {@link #runPendingAnimations()} is requested,
      * false otherwise.
      */
-    public abstract boolean animateAdd(@NonNull RecyclerView.ViewHolder holder);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public abstract boolean animateAdd(RecyclerView.ViewHolder holder);
 
     /**
      * Called when an item is moved in the RecyclerView. Implementors can choose
@@ -230,8 +233,9 @@
      * @return true if a later call to {@link #runPendingAnimations()} is requested,
      * false otherwise.
      */
-    public abstract boolean animateMove(@NonNull RecyclerView.ViewHolder holder, int fromX,
-            int fromY, int toX, int toY);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public abstract boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY,
+            int toX, int toY);
 
     /**
      * Called when an item is changed in the RecyclerView, as indicated by a call to
@@ -239,10 +243,12 @@
      * {@link RecyclerView.Adapter#notifyItemRangeChanged(int, int)}.
      * <p>
      * Implementers can choose whether and how to animate changes, but must always call
-     * {@link #dispatchChangeFinished(RecyclerView.ViewHolder, boolean)} for each non-null distinct ViewHolder,
+     * {@link #dispatchChangeFinished(RecyclerView.ViewHolder, boolean)} for each non-null
+     * distinct ViewHolder,
      * either immediately (if no animation will occur) or after the animation actually finishes.
      * If the {@code oldHolder} is the same ViewHolder as the {@code newHolder}, you must call
-     * {@link #dispatchChangeFinished(RecyclerView.ViewHolder, boolean)} once and only once. In that case, the
+     * {@link #dispatchChangeFinished(RecyclerView.ViewHolder, boolean)} once and only once. In
+     * that case, the
      * second parameter of {@code dispatchChangeFinished} is ignored.
      * <p>
      * The return value indicates whether an animation has been set up and whether the
@@ -263,9 +269,9 @@
      * @return true if a later call to {@link #runPendingAnimations()} is requested,
      * false otherwise.
      */
-    public abstract boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder,
-            @Nullable RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft,
-            int toTop);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public abstract boolean animateChange(RecyclerView.ViewHolder oldHolder,
+            RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop);
 
     /**
      * Method to be called by subclasses when a remove animation is done.
@@ -274,7 +280,8 @@
      * @see RecyclerView.ItemAnimator#animateDisappearance(RecyclerView.ViewHolder, ItemHolderInfo,
      * ItemHolderInfo)
      */
-    public final void dispatchRemoveFinished(@NonNull RecyclerView.ViewHolder item) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public final void dispatchRemoveFinished(RecyclerView.ViewHolder item) {
         onRemoveFinished(item);
         dispatchAnimationFinished(item);
     }
@@ -286,9 +293,9 @@
      * @see RecyclerView.ItemAnimator#animateDisappearance(RecyclerView.ViewHolder, ItemHolderInfo,
      * ItemHolderInfo)
      * @see RecyclerView.ItemAnimator#animatePersistence(RecyclerView.ViewHolder, ItemHolderInfo, ItemHolderInfo)
-     *
      * @see RecyclerView.ItemAnimator#animateAppearance(RecyclerView.ViewHolder, ItemHolderInfo, ItemHolderInfo)
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public final void dispatchMoveFinished(RecyclerView.ViewHolder item) {
         onMoveFinished(item);
         dispatchAnimationFinished(item);
@@ -299,6 +306,7 @@
      *
      * @param item The item which has been added
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public final void dispatchAddFinished(RecyclerView.ViewHolder item) {
         onAddFinished(item);
         dispatchAnimationFinished(item);
@@ -314,6 +322,7 @@
      *                it is the new item that replaced the old item.
      * @see #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public final void dispatchChangeFinished(RecyclerView.ViewHolder item, boolean oldItem) {
         onChangeFinished(item, oldItem);
         dispatchAnimationFinished(item);
@@ -324,6 +333,7 @@
      *
      * @param item The item being removed
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public final void dispatchRemoveStarting(RecyclerView.ViewHolder item) {
         onRemoveStarting(item);
     }
@@ -333,6 +343,7 @@
      *
      * @param item The item being moved
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public final void dispatchMoveStarting(RecyclerView.ViewHolder item) {
         onMoveStarting(item);
     }
@@ -342,6 +353,7 @@
      *
      * @param item The item being added
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public final void dispatchAddStarting(RecyclerView.ViewHolder item) {
         onAddStarting(item);
     }
@@ -355,6 +367,7 @@
      * @param oldItem true if this is the old item that was changed, false if
      *                it is the new item that replaced the old item.
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public final void dispatchChangeStarting(RecyclerView.ViewHolder item, boolean oldItem) {
         onChangeStarting(item, oldItem);
     }
@@ -367,6 +380,7 @@
      *
      * @param item The ViewHolder being animated.
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     @SuppressWarnings("UnusedParameters")
     public void onRemoveStarting(RecyclerView.ViewHolder item) {
     }
@@ -379,6 +393,7 @@
      *
      * @param item The ViewHolder being animated.
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public void onRemoveFinished(RecyclerView.ViewHolder item) {
     }
 
@@ -391,6 +406,7 @@
      * @param item The ViewHolder being animated.
      */
     @SuppressWarnings("UnusedParameters")
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public void onAddStarting(RecyclerView.ViewHolder item) {
     }
 
@@ -402,6 +418,7 @@
      *
      * @param item The ViewHolder being animated.
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public void onAddFinished(RecyclerView.ViewHolder item) {
     }
 
@@ -414,6 +431,7 @@
      * @param item The ViewHolder being animated.
      */
     @SuppressWarnings("UnusedParameters")
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public void onMoveStarting(RecyclerView.ViewHolder item) {
     }
 
@@ -425,6 +443,7 @@
      *
      * @param item The ViewHolder being animated.
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public void onMoveFinished(RecyclerView.ViewHolder item) {
     }
 
@@ -438,6 +457,7 @@
      * @param oldItem true if this is the old item that was changed, false if
      *                it is the new item that replaced the old item.
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     @SuppressWarnings("UnusedParameters")
     public void onChangeStarting(RecyclerView.ViewHolder item, boolean oldItem) {
     }
@@ -452,6 +472,7 @@
      * @param oldItem true if this is the old item that was changed, false if
      *                it is the new item that replaced the old item.
      */
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public void onChangeFinished(RecyclerView.ViewHolder item, boolean oldItem) {
     }
 }
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SnapHelper.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SnapHelper.java
index 2473afe..5ba267b 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SnapHelper.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SnapHelper.java
@@ -16,6 +16,7 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
 import android.util.DisplayMetrics;
 import android.view.View;
 import android.view.animation.DecelerateInterpolator;
@@ -133,7 +134,7 @@
      * @return array holding the calculated distances in x and y directions
      * respectively.
      */
-    @NonNull
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
     public int[] calculateScrollDistance(int velocityX, int velocityY) {
         int[] outDist = new int[2];
         mGravityScroller.fling(0, 0, velocityX, velocityY,
@@ -287,7 +288,8 @@
      */
     @SuppressWarnings("WeakerAccess")
     @Nullable
-    public abstract View findSnapView(@NonNull RecyclerView.LayoutManager layoutManager);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public abstract View findSnapView(RecyclerView.LayoutManager layoutManager);
 
     /**
      * Override to provide a particular adapter target position for snapping.
@@ -300,7 +302,7 @@
      * @return the target adapter position to you want to snap or {@link RecyclerView#NO_POSITION}
      *         if no snapping should happen
      */
-    public abstract int findTargetSnapPosition(@NonNull RecyclerView.LayoutManager layoutManager,
-            int velocityX,
-            int velocityY);
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public abstract int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager,
+            int velocityX, int velocityY);
 }
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedList.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedList.java
index fbfdc72..3ae96b8 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedList.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedList.java
@@ -16,6 +16,8 @@
 
 package androidx.recyclerview.widget;
 
+import android.annotation.SuppressLint;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
@@ -862,7 +864,8 @@
         abstract public void onChanged(int position, int count);
 
         @Override
-        public void onChanged(int position, int count, @Nullable Object payload) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void onChanged(int position, int count, Object payload) {
             onChanged(position, count);
         }
 
@@ -948,7 +951,8 @@
          *                        Other method calls (e.g. {@link #compare(Object, Object)} from
          *                        the SortedList are directly forwarded to this Callback.
          */
-        public BatchedCallback(@NonNull Callback<T2> wrappedCallback) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public BatchedCallback(Callback<T2> wrappedCallback) {
             mWrappedCallback = wrappedCallback;
             mBatchingListUpdateCallback = new BatchingListUpdateCallback(mWrappedCallback);
         }
@@ -979,7 +983,8 @@
         }
 
         @Override
-        public void onChanged(int position, int count, @Nullable Object payload) {
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        public void onChanged(int position, int count, Object payload) {
             mBatchingListUpdateCallback.onChanged(position, count, payload);
         }
 
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedListAdapterCallback.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedListAdapterCallback.java
index 59cdb11..639a26a 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedListAdapterCallback.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/SortedListAdapterCallback.java
@@ -16,8 +16,7 @@
 
 package androidx.recyclerview.widget;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import android.annotation.SuppressLint;
 
 /**
  * A {@link SortedList.Callback} implementation that can bind a {@link SortedList} to a
@@ -33,7 +32,10 @@
      *
      * @param adapter The Adapter instance which should receive events from the SortedList.
      */
-    public SortedListAdapterCallback(@NonNull RecyclerView.Adapter<?> adapter) {
+    public SortedListAdapterCallback(
+            // b/240775049: Cannot annotate properly
+            @SuppressLint({"UnknownNullness", "MissingNullability"})
+            RecyclerView.Adapter<?> adapter) {
         mAdapter = adapter;
     }
 
@@ -58,7 +60,8 @@
     }
 
     @Override
-    public void onChanged(int position, int count, @Nullable Object payload) {
+    @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+    public void onChanged(int position, int count, Object payload) {
         mAdapter.notifyItemRangeChanged(position, count, payload);
     }
 }
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ThreadUtil.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ThreadUtil.java
index 630c8f7..541f388 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ThreadUtil.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/ThreadUtil.java
@@ -16,7 +16,7 @@
 
 package androidx.recyclerview.widget;
 
-import androidx.annotation.NonNull;
+import android.annotation.SuppressLint;
 
 interface ThreadUtil<T> {
 
@@ -24,7 +24,8 @@
 
         void updateItemCount(int generation, int itemCount);
 
-        void addTile(int generation, @NonNull TileList.Tile<T> tile);
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        void addTile(int generation, TileList.Tile<T> tile);
 
         void removeTile(int generation, int position);
     }
@@ -38,7 +39,8 @@
 
         void loadTile(int position, int scrollHint);
 
-        void recycleTile(@NonNull TileList.Tile<T> tile);
+        @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly
+        void recycleTile(TileList.Tile<T> tile);
     }
 
     MainThreadCallback<T> getMainThreadProxy(MainThreadCallback<T> callback);
diff --git a/remotecallback/processor/lint-baseline.xml b/remotecallback/processor/lint-baseline.xml
index 0823dcd..ceacbd4 100644
--- a/remotecallback/processor/lint-baseline.xml
+++ b/remotecallback/processor/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="BanSynchronizedMethods"
diff --git a/room/OWNERS b/room/OWNERS
index 46a7ef4..d3aa3d9 100644
--- a/room/OWNERS
+++ b/room/OWNERS
@@ -3,5 +3,6 @@
 sergeyv@google.com
 yboyar@google.com
 dustinlam@google.com
+elifbilgin@google.com
 
 per-file settings.gradle = rahulrav@google.com
diff --git a/room/integration-tests/testapp/lint-baseline.xml b/room/integration-tests/testapp/lint-baseline.xml
index fbc298f..dad4c89 100644
--- a/room/integration-tests/testapp/lint-baseline.xml
+++ b/room/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -56,24 +56,6 @@
     </issue>
 
     <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDatabase` of class `SampleDatabaseService` requires synthetic accessor"
-        errorLine1="            mDatabase.getCustomerDao().insert(customer);"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/integration/testapp/SampleDatabaseService.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDatabase` of class `SampleDatabaseService` requires synthetic accessor"
-        errorLine1="            final LiveData&lt;List&lt;Customer>> customers = mDatabase.getCustomerDao().all();"
-        errorLine2="                                                       ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/room/integration/testapp/SampleDatabaseService.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 String getName() {"
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java
index 1e2df59..264f38f 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/WriteAheadLoggingTest.java
@@ -44,6 +44,7 @@
 import androidx.sqlite.db.SupportSQLiteDatabase;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.platform.app.InstrumentationRegistry;
@@ -67,6 +68,7 @@
 import java.util.concurrent.TimeoutException;
 
 @RunWith(AndroidJUnit4.class)
+@FlakyTest(bugId = 241095868)
 @LargeTest
 @SdkSuppress(minSdkVersion = 16)
 public class WriteAheadLoggingTest {
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 c9ca6f5..95b43d7 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
@@ -41,32 +41,29 @@
 
 fun XAnnotation.toAnnotationSpec(): AnnotationSpec {
   val builder = AnnotationSpec.builder(className)
-  annotationValues.forEach { builder.visitAnnotationValue(it) }
+  annotationValues.forEach { builder.addAnnotationValue(it) }
   return builder.build()
 }
 
-private fun AnnotationSpec.Builder.visitAnnotationValue(annotationValue: XAnnotationValue) {
-  val name = annotationValue.name
-  when (val value = annotationValue.value) {
-    is XAnnotation -> addMember(name, "\$L", value.toAnnotationSpec())
-    is XVariableElement -> addMember(name, "\$T.\$L", value.type.typeName, value.name)
-    is XType -> addMember(name, "\$T.class", value.typeName)
-    is List<*> -> value.forEach { if (it is XAnnotationValue) { visitAnnotationValue(it) } }
-    else -> this.addMemberForCommonValue(name, value)
-  }
-}
-
-private fun AnnotationSpec.Builder.addMemberForCommonValue(memberName: String, value: Any?) {
-    requireNotNull(value) { "value == null, constant non-null value expected for $memberName" }
-    require(SourceVersion.isName(memberName)) { "not a valid name: $memberName" }
-    when (value) {
-        is Class<*> -> addMember(memberName, "\$T.class", value)
-        is Enum<*> -> addMember(memberName, "\$T.\$L", value.javaClass, value.name)
-        is String -> addMember(memberName, "\$S", value)
-        is Float -> addMember(memberName, "\$Lf", value)
-        is Char -> addMember(memberName, "'\$L'", characterLiteralWithoutSingleQuotes(value))
-        else -> addMember(memberName, "\$L", value)
+private fun AnnotationSpec.Builder.addAnnotationValue(annotationValue: XAnnotationValue) {
+  annotationValue.apply {
+    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)
     }
+  }
 }
 
 private fun characterLiteralWithoutSingleQuotes(c: Char): String? {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt
index ffcfa94..d739910 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationBox.kt
@@ -25,7 +25,7 @@
 import javax.lang.model.element.AnnotationValue
 import javax.lang.model.element.VariableElement
 import javax.lang.model.type.TypeMirror
-import javax.lang.model.util.SimpleAnnotationValueVisitor6
+import javax.lang.model.util.SimpleAnnotationValueVisitor8
 
 internal interface JavacClassGetter {
     fun getAsType(methodName: String): XType?
@@ -137,80 +137,70 @@
     )
 }
 
-@Suppress("DEPRECATION")
-private val ANNOTATION_VALUE_TO_INT_VISITOR = object : SimpleAnnotationValueVisitor6<Int?, Void>() {
-    override fun visitInt(i: Int, p: Void?): Int? {
+private val ANNOTATION_VALUE_TO_INT_VISITOR = object : SimpleAnnotationValueVisitor8<Int?, Void>() {
+    override fun visitInt(i: Int, p: Void?): Int {
         return i
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_DOUBLE_VISITOR =
-    object : SimpleAnnotationValueVisitor6<Double?, Void>() {
-        override fun visitDouble(i: Double, p: Void?): Double? {
+    object : SimpleAnnotationValueVisitor8<Double?, Void>() {
+        override fun visitDouble(i: Double, p: Void?): Double {
             return i
         }
     }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_FLOAT_VISITOR =
-    object : SimpleAnnotationValueVisitor6<Float?, Void>() {
-        override fun visitFloat(i: Float, p: Void?): Float? {
+    object : SimpleAnnotationValueVisitor8<Float?, Void>() {
+        override fun visitFloat(i: Float, p: Void?): Float {
             return i
         }
     }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_CHAR_VISITOR =
-    object : SimpleAnnotationValueVisitor6<Char?, Void>() {
-        override fun visitChar(i: Char, p: Void?): Char? {
+    object : SimpleAnnotationValueVisitor8<Char?, Void>() {
+        override fun visitChar(i: Char, p: Void?): Char {
             return i
         }
     }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_BYTE_VISITOR =
-    object : SimpleAnnotationValueVisitor6<Byte?, Void>() {
-        override fun visitByte(i: Byte, p: Void?): Byte? {
+    object : SimpleAnnotationValueVisitor8<Byte?, Void>() {
+        override fun visitByte(i: Byte, p: Void?): Byte {
             return i
         }
     }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_SHORT_VISITOR =
-    object : SimpleAnnotationValueVisitor6<Short?, Void>() {
-        override fun visitShort(i: Short, p: Void?): Short? {
+    object : SimpleAnnotationValueVisitor8<Short?, Void>() {
+        override fun visitShort(i: Short, p: Void?): Short {
             return i
         }
     }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_LONG_VISITOR =
-    object : SimpleAnnotationValueVisitor6<Long?, Void>() {
-        override fun visitLong(i: Long, p: Void?): Long? {
+    object : SimpleAnnotationValueVisitor8<Long?, Void>() {
+        override fun visitLong(i: Long, p: Void?): Long {
             return i
         }
     }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_BOOLEAN_VISITOR = object :
-    SimpleAnnotationValueVisitor6<Boolean?, Void>() {
-    override fun visitBoolean(b: Boolean, p: Void?): Boolean? {
+    SimpleAnnotationValueVisitor8<Boolean?, Void>() {
+    override fun visitBoolean(b: Boolean, p: Void?): Boolean {
         return b
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_TO_STRING_VISITOR = object :
-    SimpleAnnotationValueVisitor6<String?, Void>() {
+    SimpleAnnotationValueVisitor8<String?, Void>() {
     override fun visitString(s: String?, p: Void?): String? {
         return s
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_STRING_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<String>, Void>() {
+    SimpleAnnotationValueVisitor8<List<String>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<String> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_STRING_VISITOR.visit(it)
@@ -218,9 +208,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_INT_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Int>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Int>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Int> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_INT_VISITOR.visit(it)
@@ -228,9 +217,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_DOUBLE_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Double>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Double>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Double> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_DOUBLE_VISITOR.visit(it)
@@ -238,9 +226,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_FLOAT_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Float>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Float>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Float> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_FLOAT_VISITOR.visit(it)
@@ -248,9 +235,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_CHAR_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Char>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Char>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Char> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_CHAR_VISITOR.visit(it)
@@ -258,9 +244,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_BYTE_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Byte>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Byte>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Byte> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_BYTE_VISITOR.visit(it)
@@ -268,9 +253,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_SHORT_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Short>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Short>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Short> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_SHORT_VISITOR.visit(it)
@@ -278,9 +262,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_LONG_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Long>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Long>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Long> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_LONG_VISITOR.visit(it)
@@ -288,9 +271,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private val ANNOTATION_VALUE_BOOLEAN_ARR_VISITOR = object :
-    SimpleAnnotationValueVisitor6<List<Boolean>, Void>() {
+    SimpleAnnotationValueVisitor8<List<Boolean>, Void>() {
     override fun visitArray(vals: MutableList<out AnnotationValue>?, p: Void?): List<Boolean> {
         return vals?.mapNotNull {
             ANNOTATION_VALUE_TO_BOOLEAN_VISITOR.visit(it)
@@ -372,9 +354,8 @@
 
 // code below taken from dagger2
 // compiler/src/main/java/dagger/internal/codegen/ConfigurationAnnotations.java
-@Suppress("DEPRECATION")
 private val TO_LIST_OF_TYPES = object :
-    SimpleAnnotationValueVisitor6<List<TypeMirror>, Void?>() {
+    SimpleAnnotationValueVisitor8<List<TypeMirror>, Void?>() {
     override fun visitArray(values: MutableList<out AnnotationValue>?, p: Void?): List<TypeMirror> {
         return values?.mapNotNull {
             val tmp = TO_TYPE.visit(it)
@@ -382,13 +363,12 @@
         } ?: emptyList()
     }
 
-    override fun defaultAction(o: Any?, p: Void?): List<TypeMirror>? {
+    override fun defaultAction(o: Any?, p: Void?): List<TypeMirror> {
         return emptyList()
     }
 }
 
-@Suppress("DEPRECATION")
-private val TO_TYPE = object : SimpleAnnotationValueVisitor6<TypeMirror, Void>() {
+private val TO_TYPE = object : SimpleAnnotationValueVisitor8<TypeMirror, Void>() {
 
     override fun visitType(t: TypeMirror, p: Void?): TypeMirror {
         return t
@@ -419,12 +399,11 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private class AnnotationListVisitor<T : Annotation>(
     private val env: JavacProcessingEnv,
     private val annotationClass: Class<T>
 ) :
-    SimpleAnnotationValueVisitor6<Array<JavacAnnotationBox<T>>, Void?>() {
+    SimpleAnnotationValueVisitor8<Array<JavacAnnotationBox<T>>, Void?>() {
     override fun visitArray(
         values: MutableList<out AnnotationValue>?,
         void: Void?
@@ -434,9 +413,8 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private class EnumListVisitor<T : Enum<T>>(private val enumClass: Class<T>) :
-    SimpleAnnotationValueVisitor6<Array<T>, Void?>() {
+    SimpleAnnotationValueVisitor8<Array<T>, Void?>() {
     override fun visitArray(
         values: MutableList<out AnnotationValue>?,
         void: Void?
@@ -452,18 +430,17 @@
     }
 }
 
-@Suppress("DEPRECATION")
 private class AnnotationClassVisitor<T : Annotation>(
     private val env: JavacProcessingEnv,
     private val annotationClass: Class<T>
 ) :
-    SimpleAnnotationValueVisitor6<JavacAnnotationBox<T>?, Void?>() {
+    SimpleAnnotationValueVisitor8<JavacAnnotationBox<T>?, Void?>() {
     override fun visitAnnotation(a: AnnotationMirror?, v: Void?) = a?.box(env, annotationClass)
 }
 
-@Suppress("UNCHECKED_CAST", "DEPRECATION", "BanUncheckedReflection")
+@Suppress("UNCHECKED_CAST", "BanUncheckedReflection")
 private fun <T : Enum<*>> AnnotationValue.getAsEnum(enumClass: Class<T>): T {
-    return object : SimpleAnnotationValueVisitor6<T, Void>() {
+    return object : SimpleAnnotationValueVisitor8<T, Void>() {
         override fun visitEnumConstant(value: VariableElement?, p: Void?): T {
             return enumClass.getDeclaredMethod("valueOf", String::class.java)
                 .invoke(null, value!!.simpleName.toString()) as T
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/TypeMirrorExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/TypeMirrorExt.kt
index ca9f866..d6ad8b1 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/TypeMirrorExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/TypeMirrorExt.kt
@@ -18,11 +18,11 @@
 
 import javax.lang.model.type.TypeMirror
 import javax.lang.model.type.WildcardType
-import javax.lang.model.util.SimpleTypeVisitor7
+import javax.lang.model.util.SimpleTypeVisitor8
 
 internal fun TypeMirror.extendsBound(): TypeMirror? {
     return this.accept(
-        object : SimpleTypeVisitor7<TypeMirror?, Void?>() {
+        object : SimpleTypeVisitor8<TypeMirror?, Void?>() {
             override fun visitWildcard(type: WildcardType, ignored: Void?): TypeMirror? {
                 return type.extendsBound ?: type.superBound
             }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/JvmDescriptorUtils.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/JvmDescriptorUtils.kt
index e74a6bb..6511f83 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/JvmDescriptorUtils.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/kotlin/JvmDescriptorUtils.kt
@@ -67,13 +67,14 @@
             when (nestingKind) {
                 NestingKind.TOP_LEVEL ->
                     qualifiedName.toString().replace('.', '/')
-                NestingKind.MEMBER ->
+                NestingKind.MEMBER, NestingKind.LOCAL ->
                     enclosingElement.internalName + "$" + simpleName
-                NestingKind.LOCAL, NestingKind.ANONYMOUS ->
+                NestingKind.ANONYMOUS ->
                     error("Unsupported nesting $nestingKind")
                 else ->
                     error("Unsupported, nestingKind == null")
             }
+        is ExecutableElement -> enclosingElement.internalName
         is QualifiedNameable -> qualifiedName.toString().replace('.', '/')
         else -> simpleName.toString()
     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt
index 7d633c8..51a0c6e 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspAnnotation.kt
@@ -53,13 +53,16 @@
                 .filter { it.isAbstract() }
                 .associate { it.name to it.returnType }
         }
+        // KSAnnotated.arguments isn't guaranteed to have the same ordering as declared in the
+        // annotation declaration, so we order it manually using a map from name to index.
+        val indexByName = typesByName.keys.mapIndexed { index, name -> name to index }.toMap()
         ksAnnotated.arguments.map {
             val valueName = it.name?.asString()
                 ?: error("Value argument $it does not have a name.")
             val valueType = typesByName[valueName]
                 ?: error("Value type not found for $valueName.")
             KspAnnotationValue(env, this, valueType, it)
-        }
+        }.sortedBy { indexByName[it.name] }
     }
 
     override fun <T : Annotation> asAnnotationBox(annotationClass: Class<T>): XAnnotationBox<T> {
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 35799bf..3a55b34 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
@@ -78,8 +78,9 @@
     fun testBooleanValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     boolean booleanParam();
                     boolean[] booleanArrayParam();
@@ -94,8 +95,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val booleanParam: Boolean,
                     val booleanArrayParam: BooleanArray,
@@ -130,9 +132,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        booleanParam = true,
+                        booleanArrayParam = {true, false, true},
+                        booleanVarArgsParam = {false, true, false}
+                    )
+                    """.removeWhiteSpace())
 
             val booleanParam = annotation.getAnnotationValue("booleanParam")
             checkSingleValue(booleanParam, true)
@@ -149,8 +161,9 @@
     fun testIntValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     int intParam();
                     int[] intArrayParam();
@@ -165,8 +178,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val intParam: Int,
                     val intArrayParam: IntArray,
@@ -201,9 +215,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        intParam = 1,
+                        intArrayParam = {3, 5, 7},
+                        intVarArgsParam = {9, 11, 13}
+                    )
+                    """.removeWhiteSpace())
 
             val intParam = annotation.getAnnotationValue("intParam")
             checkSingleValue(intParam, 1)
@@ -220,8 +244,9 @@
     fun testShortValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     short shortParam();
                     short[] shortArrayParam();
@@ -236,8 +261,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val shortParam: Short,
                     val shortArrayParam: ShortArray,
@@ -272,9 +298,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        shortParam = 1,
+                        shortArrayParam = {3, 5, 7},
+                        shortVarArgsParam = {9, 11, 13}
+                    )
+                    """.removeWhiteSpace())
 
             val shortParam = annotation.getAnnotationValue("shortParam")
             checkSingleValue(shortParam, 1)
@@ -291,8 +327,9 @@
     fun testLongValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     long longParam();
                     long[] longArrayParam();
@@ -307,8 +344,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val longParam: Long,
                     val longArrayParam: LongArray,
@@ -343,9 +381,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        longParam = 1,
+                        longArrayParam = {3, 5, 7},
+                        longVarArgsParam = {9, 11, 13}
+                    )
+                    """.removeWhiteSpace())
 
             val longParam = annotation.getAnnotationValue("longParam")
             checkSingleValue(longParam, 1L)
@@ -362,8 +410,9 @@
     fun testFloatValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     float floatParam();
                     float[] floatArrayParam();
@@ -378,8 +427,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val floatParam: Float,
                     val floatArrayParam: FloatArray,
@@ -414,9 +464,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        floatParam = 1.1f,
+                        floatArrayParam = {3.1f, 5.1f, 7.1f},
+                        floatVarArgsParam = {9.1f, 11.1f, 13.1f}
+                    )
+                    """.removeWhiteSpace())
 
             val floatParam = annotation.getAnnotationValue("floatParam")
             checkSingleValue(floatParam, 1.1F)
@@ -433,8 +493,9 @@
     fun testDoubleValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     double doubleParam();
                     double[] doubleArrayParam();
@@ -449,8 +510,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val doubleParam: Double,
                     val doubleArrayParam: DoubleArray,
@@ -485,9 +547,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        doubleParam = 1.1,
+                        doubleArrayParam = {3.1, 5.1, 7.1},
+                        doubleVarArgsParam = {9.1, 11.1, 13.1}
+                    )
+                    """.removeWhiteSpace())
 
             val doubleParam = annotation.getAnnotationValue("doubleParam")
             checkSingleValue(doubleParam, 1.1)
@@ -504,8 +576,9 @@
     fun testByteValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     byte byteParam();
                     byte[] byteArrayParam();
@@ -520,8 +593,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val byteParam: Byte,
                     val byteArrayParam: ByteArray,
@@ -556,9 +630,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        byteParam = 1,
+                        byteArrayParam = {3, 5, 7},
+                        byteVarArgsParam = {9, 11, 13}
+                    )
+                    """.removeWhiteSpace())
 
             val byteParam = annotation.getAnnotationValue("byteParam")
             checkSingleValue(byteParam, 1)
@@ -575,8 +659,9 @@
     fun testCharValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     char charParam();
                     char[] charArrayParam();
@@ -591,8 +676,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val charParam: Char,
                     val charArrayParam: CharArray,
@@ -627,9 +713,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        charParam = '1',
+                        charArrayParam = {'2', '3', '4'},
+                        charVarArgsParam = {'5', '6', '7'}
+                    )
+                    """.removeWhiteSpace())
 
             val charParam = annotation.getAnnotationValue("charParam")
             checkSingleValue(charParam, '1')
@@ -646,8 +742,9 @@
     fun testStringValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface MyAnnotation {
                     String stringParam();
                     String[] stringArrayParam();
@@ -662,8 +759,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class MyAnnotation(
                     val stringParam: String,
                     val stringArrayParam: Array<String>,
@@ -700,9 +798,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        stringParam = "1",
+                        stringArrayParam = {"3", "5", "7"},
+                        stringVarArgsParam = {"9", "11", "13"}
+                    )
+                    """.removeWhiteSpace())
 
             val stringParam = annotation.getAnnotationValue("stringParam")
             checkSingleValue(stringParam, "1")
@@ -719,8 +827,9 @@
     fun testEnumValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 enum MyEnum {V1, V2, V3}
                 @interface MyAnnotation {
                     MyEnum enumParam();
@@ -736,8 +845,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 enum class MyEnum {V1, V2, V3}
                 annotation class MyAnnotation(
                     val enumParam: MyEnum,
@@ -753,7 +863,7 @@
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
-            val myEnumTypeName = ClassName.get("", "MyEnum")
+            val myEnumTypeName = ClassName.get("", "test.MyEnum")
 
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: String) {
                 assertThat(annotationValue.valueType.typeName).isEqualTo(myEnumTypeName)
@@ -775,9 +885,18 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        enumParam = test.MyEnum.V1,
+                        enumArrayParam = {test.MyEnum.V1, test.MyEnum.V2, test.MyEnum.V3},
+                        enumVarArgsParam = {test.MyEnum.V3, test.MyEnum.V2, test.MyEnum.V1}
+                    )
+                    """.removeWhiteSpace())
 
             val enumParam = annotation.getAnnotationValue("enumParam")
             checkSingleValue(enumParam, "V1")
@@ -794,8 +913,9 @@
     fun testTypeValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 class C1 {}
                 class C2 {}
                 class C3 {}
@@ -813,8 +933,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 class C1
                 class C2
                 class C3
@@ -871,9 +992,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        typeParam = test.C1.class,
+                        typeArrayParam = {test.C1.class, test.C2.class, test.C3.class},
+                        typeVarArgsParam = {test.C3.class, test.C2.class, test.C1.class}
+                    )
+                    """.removeWhiteSpace())
 
             val typeParam = annotation.getAnnotationValue("typeParam")
             checkSingleValue(typeParam, "C1")
@@ -890,8 +1021,9 @@
     fun testAnnotationValue() {
         runTest(
             javaSource = Source.java(
-                "MyClass",
+                "test.MyClass",
                 """
+                package test;
                 @interface A {
                     String value();
                 }
@@ -909,8 +1041,9 @@
                 """.trimIndent()
             ) as Source.JavaSource,
             kotlinSource = Source.kotlin(
-                "MyClass.kt",
+                "test.MyClass.kt",
                 """
+                package test
                 annotation class A(val value: String)
                 annotation class MyAnnotation(
                     val annotationParam: A,
@@ -926,7 +1059,7 @@
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
-            val aTypeName = ClassName.get("", "A")
+            val aTypeName = ClassName.get("", "test.A")
 
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: String) {
                 assertThat(annotationValue.valueType.typeName).isEqualTo(aTypeName)
@@ -949,9 +1082,19 @@
                 }
             }
 
-            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+            val annotation = invocation.processingEnv.requireTypeElement("test.MyClass")
                 .getAllAnnotations()
-                .single { it.name == "MyAnnotation" }
+                .single { it.qualifiedName == "test.MyAnnotation" }
+
+            // Compare the AnnotationSpec string ignoring whitespace
+            assertThat(annotation.toAnnotationSpec().toString().removeWhiteSpace())
+                .isEqualTo("""
+                    @test.MyAnnotation(
+                        annotationParam = @test.A("1"),
+                        annotationArrayParam = {@test.A("3"), @test.A("5"), @test.A("7")},
+                        annotationVarArgsParam = {@test.A("9"),@test.A("11"),@test.A("13")}
+                    )
+                    """.removeWhiteSpace())
 
             val annotationParam = annotation.getAnnotationValue("annotationParam")
             checkSingleValue(annotationParam, "1")
@@ -964,6 +1107,10 @@
         }
     }
 
+    private fun String.removeWhiteSpace(): String {
+        return this.replace("\\s+".toRegex(), "")
+    }
+
     enum class SourceKind { JAVA, KOTLIN }
 
     companion object {
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt
index 79b3ae2..f451bd8 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/javac/kotlin/KotlinMetadataElementTest.kt
@@ -751,6 +751,43 @@
         }
     }
 
+    @Test
+    fun methods_localNestingKind() {
+        // Only private functions are relevant to the test since public (or internal) functions
+        // are required to declare their return type explicitly when right-hand side is ambiguous.
+        // b/232742201
+        val src = Source.kotlin(
+            "Subject.kt",
+            """
+            object Subject {
+                private fun localA() = object : A { }
+                private fun localAB() = object : A, B { }
+                private fun localABC() = object : C(), A, B { }
+                private fun localC() = object : C() { }
+                private fun localAC() = object : C(), A { }
+                private fun localAB_declaredA(): A = object : A, B { }
+                private fun localAB_declaredB(): B = object : A, B { }
+                private fun localABC_declaredC(): C = object : C(), A, B { }
+            }
+            interface A
+            interface B
+            abstract class C
+            """.trimIndent()
+        )
+        simpleRun(listOf(src)) { invocation ->
+            val (subjectElement, subjectMetadata) = getMetadataElement(invocation, "Subject")
+            fun assertKmFunctionFound(functionName: String) {
+                val kmFunction = subjectMetadata.getFunctionMetadata(
+                    subjectElement.getDeclaredMethod(functionName)
+                )
+                assertThat(kmFunction).isNotNull()
+            }
+            subjectElement.getDeclaredMethods().forEach {
+                assertKmFunctionFound(it.simpleName.toString())
+            }
+        }
+    }
+
     private fun TypeElement.getDeclaredMethods() = ElementFilter.methodsIn(enclosedElements)
 
     private fun TypeElement.getDeclaredMethod(name: String) = getDeclaredMethods().first {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt b/room/room-compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
index 033b762..a93964d 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/ext/javapoet_ext.kt
@@ -59,6 +59,8 @@
     val ROOM_DB_CONFIG: ClassName = ClassName.get(ROOM_PACKAGE, "DatabaseConfiguration")
     val INSERTION_ADAPTER: ClassName =
         ClassName.get(ROOM_PACKAGE, "EntityInsertionAdapter")
+    val UPSERTION_ADAPTER: ClassName =
+        ClassName.get(ROOM_PACKAGE, "EntityUpsertionAdapter")
     val DELETE_OR_UPDATE_ADAPTER: ClassName =
         ClassName.get(ROOM_PACKAGE, "EntityDeletionOrUpdateAdapter")
     val SHARED_SQLITE_STMT: ClassName =
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 7a736ef..3b97e6a 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
@@ -117,9 +117,14 @@
         val preparedQueries = groupedPreparedQueries[false] ?: emptyList()
         // queries that must be rebuilt every single time
         val oneOffPreparedQueries = groupedPreparedQueries[true] ?: emptyList()
-        val shortcutMethods = createInsertionMethods() +
-            createDeletionMethods() + createUpdateMethods() + createTransactionMethods() +
-            createPreparedQueries(preparedQueries) + createUpsertMethods()
+        val shortcutMethods = buildList {
+            addAll(createInsertionMethods())
+            addAll(createDeletionMethods())
+            addAll(createUpdateMethods())
+            addAll(createTransactionMethods())
+            addAll(createPreparedQueries(preparedQueries))
+            addAll(createUpsertMethods())
+        }
 
         builder.apply {
             addOriginatingElement(dbElement)
@@ -389,7 +394,7 @@
 
         val scope = CodeGenScope(this)
 
-        // TODO: (b/240491383) remove methodBinder nullability
+        // TODO b/240491383 Remove nullability from methodBinders for convertAndReturn
         method.methodBinder?.convertAndReturn(
             parameters = method.parameters,
             adapters = insertionAdapters,
@@ -475,7 +480,13 @@
     private fun createUpsertMethods(): List<PreparedStmtQuery> {
         return dao.upsertionMethods
             .map { upsertionMethod ->
-                val fields = emptyMap<String, Pair<FieldSpec, TypeSpec>>()
+                val entities = upsertionMethod.entities
+                val fields = entities.mapValues {
+                    val spec = getOrCreateField(UpsertionAdapterField(it.value))
+                    val impl = EntityUpsertionAdapterWriter.create(it.value)
+                        .createConcrete(it.value, this@DaoWriter, dbField.name)
+                    spec to impl
+                }
                 val methodImpl = overrideWithoutAnnotations(
                     upsertionMethod.element,
                     declaredDao
@@ -488,7 +499,7 @@
 
     private fun createUpsertionMethodBody(
         method: UpsertionMethod,
-        upsertionAdapters: Map<String, Pair<FieldSpec, TypeSpec>>
+        upsertionAdapters: Map<String, Pair<FieldSpec, CodeBlock>>
     ): CodeBlock {
         if (upsertionAdapters.isEmpty()) {
             return CodeBlock.builder().build()
@@ -496,6 +507,7 @@
 
         val scope = CodeGenScope(this)
 
+        // TODO b/240491383 Remove nullability from methodBinders for convertAndReturn
         method.methodBinder?.convertAndReturn(
             parameters = method.parameters,
             adapters = upsertionAdapters,
@@ -595,7 +607,7 @@
      * @param methodImpl The body of the query method implementation.
      */
     data class PreparedStmtQuery(
-        val fields: Map<String, Pair<FieldSpec, TypeSpec>>,
+        val fields: Map<String, Pair<FieldSpec, Any>>,
         val methodImpl: MethodSpec
     ) {
         companion object {
@@ -643,6 +655,23 @@
         }
     }
 
+    class UpsertionAdapterField(
+        val shortcutEntity: ShortcutEntity
+    ) : SharedFieldSpec(
+        baseName = "upsertionAdapterOf${shortcutEntityFieldNamePart(shortcutEntity)}",
+        type = ParameterizedTypeName.get(
+            RoomTypeNames.UPSERTION_ADAPTER, shortcutEntity.pojo.typeName
+        )
+    ) {
+        override fun getUniqueKey(): String {
+            return "${shortcutEntity.pojo.typeName}-${shortcutEntity.entityTypeName}"
+        }
+
+        override fun prepare(writer: ClassWriter, builder: FieldSpec.Builder) {
+            builder.addModifiers(PRIVATE, FINAL)
+        }
+    }
+
     class PreparedStatementField(val method: QueryMethod) : SharedFieldSpec(
         "preparedStmtOf${method.element.jvmName.capitalize(Locale.US)}",
         RoomTypeNames.SHARED_SQLITE_STMT
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
new file mode 100644
index 0000000..11dc2a9
--- /dev/null
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpsertionAdapterWriter.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.writer
+
+import androidx.room.ext.L
+import androidx.room.ext.RoomTypeNames
+import androidx.room.ext.T
+import androidx.room.vo.Pojo
+import androidx.room.vo.ShortcutEntity
+import com.squareup.javapoet.CodeBlock
+import com.squareup.javapoet.ParameterizedTypeName
+
+// TODO b/240736981 need to implement the writer's test
+class EntityUpsertionAdapterWriter private constructor(
+    val tableName: String,
+    val pojo: Pojo
+) {
+    companion object {
+        fun create(entity: ShortcutEntity): EntityUpsertionAdapterWriter {
+            return EntityUpsertionAdapterWriter(
+                tableName = entity.tableName,
+                pojo = entity.pojo
+            )
+        }
+    }
+
+    fun createConcrete(
+        entity: ShortcutEntity,
+        classWriter: ClassWriter,
+        dbParam: String
+    ): CodeBlock {
+        val upsertionAdapter = ParameterizedTypeName.get(
+            RoomTypeNames.UPSERTION_ADAPTER, pojo.typeName
+        )
+        val insertionHelper = EntityInsertionAdapterWriter.create(entity, "")
+            .createAnonymous(classWriter, dbParam)
+        val updateHelper = EntityUpdateAdapterWriter.create(entity, "")
+            .createAnonymous(classWriter, dbParam)
+        return CodeBlock.builder().add("new $T($L, $L)",
+            upsertionAdapter, insertionHelper, updateHelper
+        ).build()
+    }
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/lint-baseline.xml b/samples/Support7Demos/lint-baseline.xml
index 10c23fb..d671b58 100644
--- a/samples/Support7Demos/lint-baseline.xml
+++ b/samples/Support7Demos/lint-baseline.xml
@@ -55,8 +55,6 @@
             file="src/main/res/layout/appcompat_night_mode.xml"/>
         <location
             file="src/main/res/layout/appcompat_night_mode.xml"
-            line="23"
-            column="9"
             message="`wrap_content` here may not work well with WebView below"/>
     </issue>
 
diff --git a/samples/SupportAnimationDemos/lint-baseline.xml b/samples/SupportAnimationDemos/lint-baseline.xml
index 730844a..a696648 100644
--- a/samples/SupportAnimationDemos/lint-baseline.xml
+++ b/samples/SupportAnimationDemos/lint-baseline.xml
@@ -1,203 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim1X.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStiffness` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim1X.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim1Y.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStiffness` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim1Y.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim2X.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStiffness` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim2X.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim2Y.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStiffness` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    anim2Y.getSpring().setStiffness(mStiffness).setDampingRatio(mDampingRatio);"
-        errorLine2="                                                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    mDampingRatio = i / 80.0f;"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    mDampingRatio = (float) Math.exp((i - 90) / 10.0);"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    mDampingRatio = 1;"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                drTxt.setText(String.format(&quot;%.4f&quot;, (float) mDampingRatio));"
-        errorLine2="                                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStiffness` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                mStiffness = stiffness;"
-        errorLine2="                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/MainActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSpringView` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                mSpringView.setMassHeight(img.getY());"
-        errorLine2="                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSpringView` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                    mSpringView.setMassHeight(img.getY());"
-        errorLine2="                    ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                    anim.getSpring().setDampingRatio(mDampingRatio).setStiffness(mStiffness);"
-        errorLine2="                                                     ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStiffness` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                    anim.getSpring().setDampingRatio(mDampingRatio).setStiffness(mStiffness);"
-        errorLine2="                                                                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                    mDampingRatio = i / 80.0f;"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                    mDampingRatio = (float) Math.exp((i - 90) / 10.0);"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                    mDampingRatio = 1;"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDampingRatio` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                drTxt.setText(String.format(&quot;%.4f&quot;, (float) mDampingRatio));"
-        errorLine2="                                                            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStiffness` of class `SpringActivity` requires synthetic accessor"
-        errorLine1="                mStiffness = stiffness;"
-        errorLine2="                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/animation/SpringActivity.java"/>
-    </issue>
+<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/samples/SupportContentDemos/lint-baseline.xml b/samples/SupportContentDemos/lint-baseline.xml
index 7e3d03f..260f1e9 100644
--- a/samples/SupportContentDemos/lint-baseline.xml
+++ b/samples/SupportContentDemos/lint-baseline.xml
@@ -1,77 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `Adapter` requires synthetic accessor"
-        errorLine1="        mAdapter = new Adapter(mPager, PAGE_SIZE);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `reset` of class `Adapter` requires synthetic accessor"
-        errorLine1="        mAdapter.reset(UnpagedDemoDataProvider.URI);"
-        errorLine2="        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentPage` of class `ContentPagerDemoActivity` requires synthetic accessor"
-        errorLine1="            mCurrentPage = page;"
-        errorLine2="            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentPage` of class `ContentPagerDemoActivity` requires synthetic accessor"
-        errorLine1="            int offset = mCurrentPage * mPageSize;"
-        errorLine2="                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `Holder` requires synthetic accessor"
-        errorLine1="            return new Holder(new TextView(ContentPagerDemoActivity.this));"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentPage` of class `ContentPagerDemoActivity` requires synthetic accessor"
-        errorLine1="                    mCurrentPage,"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `msg` of class `ContentPagerDemoActivity` requires synthetic accessor"
-        errorLine1="                msg(&quot;Content query returned a null cursor: &quot; + query.getUri());"
-        errorLine2="                ~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentPage` of class `ContentPagerDemoActivity` requires synthetic accessor"
-        errorLine1="            mCurrentPage = query.getOffset() / mPageSize;"
-        errorLine2="            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java"/>
-    </issue>
+<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/samples/SupportEmojiDemos/lint-baseline.xml b/samples/SupportEmojiDemos/lint-baseline.xml
index 32f254c..e9a7bbf 100644
--- a/samples/SupportEmojiDemos/lint-baseline.xml
+++ b/samples/SupportEmojiDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="BanSynchronizedMethods"
@@ -29,33 +29,6 @@
     </issue>
 
     <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `read` of class `EmojiRepo` requires synthetic accessor"
-        errorLine1="                    read(context);"
-        errorLine2="                    ~~~~">
-        <location
-            file="src/main/java/com/example/android/support/text/emoji/EmojiRepo.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ViewHolder` requires synthetic accessor"
-        errorLine1="                holder = new ViewHolder();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/text/emoji/ListFragment.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `init` of class `MainFragment` requires synthetic accessor"
-        errorLine1="            init();"
-        errorLine2="            ~~~~">
-        <location
-            file="src/main/java/com/example/android/support/text/emoji/MainFragment.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 ConfigLayout(Context context) {"
diff --git a/samples/SupportLeanbackDemos/lint-baseline.xml b/samples/SupportLeanbackDemos/lint-baseline.xml
index 2579349..3d3f80f 100644
--- a/samples/SupportLeanbackDemos/lint-baseline.xml
+++ b/samples/SupportLeanbackDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
+<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="MissingSuperCall"
@@ -241,9 +241,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="59"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"/>
     </issue>
 
     <issue
@@ -252,9 +250,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="69"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
@@ -263,9 +259,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="92"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
@@ -274,9 +268,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="69"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/DetailsFragment.java"/>
     </issue>
 
     <issue
@@ -285,9 +277,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemClicked: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="136"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/DetailsFragment.java"/>
     </issue>
 
     <issue
@@ -296,9 +286,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="153"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/DetailsFragment.java"/>
     </issue>
 
     <issue
@@ -307,9 +295,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="72"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -318,9 +304,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemClicked: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="139"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -329,9 +313,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="156"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -340,9 +322,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/ErrorSupportFragment.java"
-            line="32"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/ErrorSupportFragment.java"/>
     </issue>
 
     <issue
@@ -351,9 +331,7 @@
         errorLine1="                Log.i(TAG, &quot;button clicked&quot;);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/ErrorSupportFragment.java"
-            line="46"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/ErrorSupportFragment.java"/>
     </issue>
 
     <issue
@@ -362,9 +340,7 @@
         errorLine1="        Log.v(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="43"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
@@ -373,9 +349,7 @@
         errorLine1="        Log.v(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="46"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
@@ -384,9 +358,7 @@
         errorLine1="                Log.v(TAG, &quot;onScrollStateChanged &quot;"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="48"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"/>
     </issue>
 
     <issue
@@ -395,9 +367,7 @@
         errorLine1="                        if (DEBUG) Log.d(TAG, &quot;onChildSelected position=&quot; + position);"
         errorLine2="                                         ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="66"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"/>
     </issue>
 
     <issue
@@ -406,9 +376,7 @@
         errorLine1="        if (DEBUG) Log.v(TAG, &quot;onCreate&quot;);"
         errorLine2="                         ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="77"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"/>
     </issue>
 
     <issue
@@ -417,9 +385,7 @@
         errorLine1="        if (DEBUG) Log.v(TAG, &quot;onNewIntent &quot; + intent);"
         errorLine2="                         ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="89"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"/>
     </issue>
 
     <issue
@@ -428,9 +394,7 @@
         errorLine1="            if (DEBUG) Log.v(TAG, &quot;createViewHolder &quot; + viewType);"
         errorLine2="                             ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="131"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"/>
     </issue>
 
     <issue
@@ -439,9 +403,7 @@
         errorLine1="            if (DEBUG) Log.v(TAG, &quot;bindViewHolder &quot; + position + &quot; &quot; + baseHolder);"
         errorLine2="                             ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="143"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"/>
     </issue>
 
     <issue
@@ -450,9 +412,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="116"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"/>
     </issue>
 
     <issue
@@ -461,9 +421,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemClicked: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="217"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"/>
     </issue>
 
     <issue
@@ -472,9 +430,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="234"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"/>
     </issue>
 
     <issue
@@ -483,9 +439,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="119"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -494,9 +448,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemClicked: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="220"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -505,9 +457,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="237"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -516,9 +466,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackFragment.java"
-            line="67"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/PlaybackFragment.java"/>
     </issue>
 
     <issue
@@ -527,9 +475,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSupportFragment.java"
-            line="70"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSupportFragment.java"/>
     </issue>
 
     <issue
@@ -538,9 +484,7 @@
         errorLine1="            Log.e(TAG, &quot;disconnectToMediaSession: Media session disconnected&quot;);"
         errorLine2="                  ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlGlueSample.java"
-            line="156"
-            column="19"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlGlueSample.java"/>
     </issue>
 
     <issue
@@ -549,9 +493,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"
-            line="56"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -560,9 +502,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"
-            line="64"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"/>
     </issue>
 
     <issue
@@ -571,9 +511,7 @@
         errorLine1="        Log.i(TAG, String.format(&quot;Search Query Text Change %s&quot;, newQuery));"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"
-            line="111"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"/>
     </issue>
 
     <issue
@@ -582,9 +520,7 @@
         errorLine1="        Log.i(TAG, String.format(&quot;Search Query Text Submit %s&quot;, query));"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"
-            line="119"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"/>
     </issue>
 
     <issue
@@ -593,9 +529,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"
-            line="51"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"/>
     </issue>
 
     <issue
@@ -604,9 +538,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"
-            line="94"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"/>
     </issue>
 
     <issue
@@ -615,9 +547,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemClicked: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"
-            line="102"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"/>
     </issue>
 
     <issue
@@ -626,9 +556,7 @@
         errorLine1="        Log.i(TAG, &quot;onCreate&quot;);"
         errorLine2="              ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"
-            line="54"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"/>
     </issue>
 
     <issue
@@ -637,9 +565,7 @@
         errorLine1="                Log.i(TAG, &quot;onItemSelected: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"
-            line="97"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"/>
     </issue>
 
     <issue
@@ -648,7225 +574,2986 @@
         errorLine1="                Log.i(TAG, &quot;onItemClicked: &quot; + item + &quot; row &quot; + row);"
         errorLine2="                      ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"
-            line="105"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
-        errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="76"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `sRand` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                                int count = sRand.nextInt(4) + 1;"
-        errorLine2="                                            ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="181"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `sRand` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                                int count = sRand.nextInt(4) + 1;"
-        errorLine2="                                            ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="198"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                    int index = mRowsAdapter.indexOf(row);"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="211"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `sRand` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                        int headerId = sRand.nextInt();"
-        errorLine2="                                       ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="213"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                        mRowsAdapter.add(index, createRandomRow(new HeaderItem("
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="214"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                    int index = mRowsAdapter.indexOf(row);"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="224"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `sRand` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                        int headerId = sRand.nextInt();"
-        errorLine2="                                       ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="226"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                        mRowsAdapter.add("
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="227"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                    mRowsAdapter.remove(row);"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="238"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                    int index = mRowsAdapter.indexOf(row);"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="246"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                        mRowsAdapter.removeItems(index - 1, 1);"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="248"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                    int index = mRowsAdapter.indexOf(row);"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="257"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                    if (index &lt; mRowsAdapter.size() - 1) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="258"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `BrowseAnimationFragment` requires synthetic accessor"
-        errorLine1="                        mRowsAdapter.removeItems(index + 1, 1);"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"
-            line="259"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
-        errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="84"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `setupRows` of class `BrowseFragment` requires synthetic accessor"
-        errorLine1="                setupRows();"
-        errorLine2="                ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="111"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `loadData` of class `BrowseFragment` requires synthetic accessor"
-        errorLine1="                loadData();"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="112"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
-        errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="87"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `setupRows` of class `BrowseSupportFragment` requires synthetic accessor"
-        errorLine1="                setupRows();"
-        errorLine2="                ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="114"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `loadData` of class `BrowseSupportFragment` requires synthetic accessor"
-        errorLine1="                loadData();"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="115"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);"
-        errorLine2="                                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="101"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="106"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(mPhotoItem.getTitle() + &quot;(Owned)&quot;);"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="109"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="116"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(mPhotoItem.getTitle() + &quot;(Rented)&quot;);"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="118"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());"
-        errorLine2="                                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="190"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                        mPhotoItem.getImageResourceId(), context.getTheme()));"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="192"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionRent` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                adapter.set(ACTION_RENT, mActionRent);"
-        errorLine2="                                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="194"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBuy` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                adapter.set(ACTION_BUY, mActionBuy);"
-        errorLine2="                                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="195"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                mRowsAdapter.add(0, dor);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="197"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `DetailsFragment` requires synthetic accessor"
-        errorLine1="                    mRowsAdapter.add(new ListRow(header, listRowAdapter));"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="212"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `DetailsPresenterSelectionActivity` requires synthetic accessor"
-        errorLine1="            for (int i = 0; i &lt; OPTION_NAMES.length; i++) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="90"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_IDS` of class `DetailsPresenterSelectionActivity` requires synthetic accessor"
-        errorLine1="                if (OPTION_IDS[i] == ACTION_ID_SWITCH_LEGACY_ON) {"
-        errorLine2="                    ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="92"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_IDS` of class `DetailsPresenterSelectionActivity` requires synthetic accessor"
-        errorLine1="                } else if (OPTION_IDS[i] == ACTION_ID_SWITCH_LEGACY_OFF) {"
-        errorLine2="                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="96"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_IDS` of class `DetailsPresenterSelectionActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, OPTION_IDS[i], OPTION_NAMES[i],"
-        errorLine2="                                          ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="101"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `DetailsPresenterSelectionActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, OPTION_IDS[i], OPTION_NAMES[i],"
-        errorLine2="                                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="101"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addCheckedAction` of class `DetailsPresenterSelectionActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, OPTION_IDS[i], OPTION_NAMES[i],"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="101"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_DESCRIPTIONS` of class `DetailsPresenterSelectionActivity` requires synthetic accessor"
-        errorLine1="                        OPTION_DESCRIPTIONS[i], checked);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="102"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);"
-        errorLine2="                                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="104"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="109"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(mPhotoItem.getTitle() + &quot;(Owned)&quot;);"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="112"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="119"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(mPhotoItem.getTitle() + &quot;(Rented)&quot;);"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="121"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());"
-        errorLine2="                                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="193"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        mPhotoItem.getImageResourceId(), context.getTheme()));"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="195"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionRent` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                adapter.set(ACTION_RENT, mActionRent);"
-        errorLine2="                                         ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="197"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBuy` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                adapter.set(ACTION_BUY, mActionBuy);"
-        errorLine2="                                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="198"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                mRowsAdapter.add(0, dor);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="200"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `DetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    mRowsAdapter.add(new ListRow(header, listRowAdapter));"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="215"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            addEditableAction(actions, NEW_PAYMENT, &quot;Input credit card number&quot;, &quot;&quot;,"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="292"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addDatePickerAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            addDatePickerAction(actions, PAYMENT_EXPIRE, &quot;Exp:&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="295"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            addEditableAction(getActivity(), actions, FIRST_NAME, &quot;Pat&quot;, &quot;Your first name&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="420"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            addEditableAction(getActivity(), actions, LAST_NAME, &quot;Smith&quot;, &quot;Your last name&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="421"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            updatePaymentAction(addAction(actions, PAYMENT, &quot;Select Payment&quot;, &quot;&quot;, subActions));"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="423"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableDescriptionAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            addEditableDescriptionAction(actions, PASSWORD, &quot;Password&quot;, &quot;&quot;, &quot;&quot;,"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="424"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addCheckedAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(subActions, -1, sCards.get(i), &quot;&quot;,"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="449"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            addAction(subActions, NEW_PAYMENT, &quot;Add New Card&quot;, &quot;&quot;);"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="455"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            for (int i = 0; i &lt; OPTION_NAMES.length; i++) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="570"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, RADIO_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="571"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addCheckedAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, RADIO_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="571"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_DESCRIPTIONS` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="                        OPTION_DESCRIPTIONS[i], GuidedAction.DEFAULT_CHECK_SET_ID);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="572"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            for (int i = 0; i &lt; OPTION_NAMES.length; i++) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="577"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, CHECKBOX_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                                                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="578"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addCheckedAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, CHECKBOX_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="578"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_DESCRIPTIONS` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="                        OPTION_DESCRIPTIONS[i], GuidedAction.CHECKBOX_CHECK_SET_ID);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="579"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            String description = &quot;You chose: &quot; + OPTION_NAMES[(int) getOption()];"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="622"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addAction` of class `GuidedStepActivity` requires synthetic accessor"
-        errorLine1="            addAction(actions, BACK, &quot;Start Over&quot;, &quot;Let&apos;s try this again...&quot;);"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="635"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            addEditableAction(actions, NEW_PAYMENT, &quot;Input credit card number&quot;, &quot;&quot;,"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="294"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addDatePickerAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            addDatePickerAction(actions, PAYMENT_EXPIRE, &quot;Exp:&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="297"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            addEditableAction(getActivity(), actions, FIRST_NAME, &quot;Pat&quot;, &quot;Your first name&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="422"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            addEditableAction(getActivity(), actions, LAST_NAME, &quot;Smith&quot;, &quot;Your last name&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="423"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            updatePaymentAction(addAction(actions, PAYMENT, &quot;Select Payment&quot;, &quot;&quot;, subActions));"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="425"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addEditableDescriptionAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            addEditableDescriptionAction(actions, PASSWORD, &quot;Password&quot;, &quot;&quot;, &quot;&quot;,"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="426"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addCheckedAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(subActions, -1, sCards.get(i), &quot;&quot;,"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="451"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            addAction(subActions, NEW_PAYMENT, &quot;Add New Card&quot;, &quot;&quot;);"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="457"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            for (int i = 0; i &lt; OPTION_NAMES.length; i++) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="572"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, RADIO_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                                                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="573"
-            column="62"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addCheckedAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, RADIO_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="573"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_DESCRIPTIONS` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="                        OPTION_DESCRIPTIONS[i], GuidedAction.DEFAULT_CHECK_SET_ID);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="574"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            for (int i = 0; i &lt; OPTION_NAMES.length; i++) {"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="579"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, CHECKBOX_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                                                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="580"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addCheckedAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="                addCheckedAction(actions, CHECKBOX_ID_BASE + i, OPTION_NAMES[i],"
-        errorLine2="                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="580"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_DESCRIPTIONS` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="                        OPTION_DESCRIPTIONS[i], GuidedAction.CHECKBOX_CHECK_SET_ID);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="581"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `OPTION_NAMES` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            String description = &quot;You chose: &quot; + OPTION_NAMES[(int) getOption()];"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="624"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addAction` of class `GuidedStepSupportActivity` requires synthetic accessor"
-        errorLine1="            addAction(actions, BACK, &quot;Start Over&quot;, &quot;Let&apos;s try this again...&quot;);"
-        errorLine2="            ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="637"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHorizontalGridView` of class `HorizontalGridTestActivity` requires synthetic accessor"
-        errorLine1="            mHorizontalGridView.getAdapter().notifyDataSetChanged();"
-        errorLine2="            ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="114"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mItemFocusChangeListener` of class `HorizontalGridTestActivity` requires synthetic accessor"
-        errorLine1="            textView.setOnFocusChangeListener(mItemFocusChangeListener);"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="136"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mItemClickListener` of class `HorizontalGridTestActivity` requires synthetic accessor"
-        errorLine1="            textView.setOnClickListener(mItemClickListener);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="137"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `isPlaying` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                            if (isPlaying()) {"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="95"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `audioFocusLossHandler` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                                audioFocusLossHandler();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="96"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `isPlaying` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                            if (isPlaying()) {"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="100"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `audioLossFocusTransientHandler` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                                audioLossFocusTransientHandler();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="101"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `isPlaying` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                            if (isPlaying()) {"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="105"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `audioLossFocusTransientCanDuckHanlder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                                audioLossFocusTransientCanDuckHanlder();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="106"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `isPlaying` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                            if (!isPlaying()) {"
-        errorLine2="                                 ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="110"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `audioFocusGainHandler` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                                audioFocusGainHandler();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="111"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `MediaPlayerAudioHandler` requires synthetic accessor"
-        errorLine1="    private Handler mMediaPlayerHandler = new MediaPlayerAudioHandler();"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="156"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlayer` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            mPlayer.stop();"
-        errorLine2="            ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="177"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="178"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createPlaybackStateBuilder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="178"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerHandler` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerHandler.obtainMessage(FOCUS_CHANGE, focusChange, 0).sendToTarget();"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="191"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `MediaSessionCallback` requires synthetic accessor"
-        errorLine1="            mMediaSession.setCallback(new MediaSessionCallback());"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="220"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mInitialized` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mInitialized = true;"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="341"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `notifyUiWhenPlayerIsPrepared` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                notifyUiWhenPlayerIsPrepared();"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="344"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `onMediaSessionMetaDataChanged` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                onMediaSessionMetaDataChanged();"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="348"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="349"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createPlaybackStateBuilder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="349"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createPlaybackStateBuilder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    PlaybackStateCompat.Builder builder = createPlaybackStateBuilder("
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="359"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mMediaSession.setPlaybackState(builder.build());"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="363"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mFastForwardSpeedFactorIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mFastForwardSpeedFactorIndex = 0;"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="416"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRewindSpeedFactorIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mRewindSpeedFactorIndex = 0;"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="417"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlayer` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="419"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlayer` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mPlayer.setPlaybackParams(mPlayer.getPlaybackParams().setSpeed("
-        errorLine2="                                          ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="419"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mFastForwardSpeedFactorIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mFastForwardSpeedFactors[mFastForwardSpeedFactorIndex]));"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="420"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mFastForwardSpeedFactors` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mFastForwardSpeedFactors[mFastForwardSpeedFactorIndex]));"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="420"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlayer` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mPlayer.pause();"
-        errorLine2="                ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="422"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="423"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createPlaybackStateBuilder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="423"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRepeatState` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                if (mRepeatState == MEDIA_ACTION_REPEAT_ALL"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="426"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        &amp;&amp; mCurrentIndex == mMediaItemList.size() - 1) {"
-        errorLine2="                           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="427"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mShuffleMode` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    if (mShuffleMode == PlaybackStateCompat.SHUFFLE_MODE_NONE) {"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="430"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mCurrentIndex = 0;"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="431"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mCurrentIndex = generateMediaItemIndex();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="434"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `generateMediaItemIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mCurrentIndex = generateMediaItemIndex();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="434"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mCurrentMediaItem = mMediaItemList.get(mCurrentIndex);"
-        errorLine2="                                                           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="436"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentMediaItem` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mCurrentMediaItem = mMediaItemList.get(mCurrentIndex);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="436"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `setDataSource` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    setDataSource();"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="439"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRepeatState` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                } else if (mRepeatState == MEDIA_ACTION_REPEAT_ONE) {"
-        errorLine2="                           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="440"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlayer` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mPlayer.start();"
-        errorLine2="                    ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="444"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="445"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createPlaybackStateBuilder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="445"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                } else if (mCurrentIndex &lt; mMediaItemList.size() - 1) {"
-        errorLine2="                           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="447"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mShuffleMode` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    if (mShuffleMode == PlaybackStateCompat.SHUFFLE_MODE_NONE) {"
-        errorLine2="                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="448"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mCurrentIndex++;"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="449"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mCurrentIndex = generateMediaItemIndex();"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="451"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `generateMediaItemIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mCurrentIndex = generateMediaItemIndex();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="451"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentIndex` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mCurrentMediaItem = mMediaItemList.get(mCurrentIndex);"
-        errorLine2="                                                           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="453"
-            column="60"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mCurrentMediaItem` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mCurrentMediaItem = mMediaItemList.get(mCurrentIndex);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="453"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `setDataSource` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    setDataSource();"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="456"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="461"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createPlaybackStateBuilder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                    mMediaSession.setPlaybackState(createPlaybackStateBuilder("
-        errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="461"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mBufferedProgress` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mBufferedProgress = (long) getDuration() * percent / 100;"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="472"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `getDuration` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mBufferedProgress = (long) getDuration() * percent / 100;"
-        errorLine2="                                                   ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="472"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `createPlaybackStateBuilder` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        PlaybackStateCompat.Builder builder = createPlaybackStateBuilder("
-        errorLine2="                                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="473"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mBufferedProgress` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        builder.setBufferedPosition(mBufferedProgress);"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="475"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="                        mMediaSession.setPlaybackState(builder.build());"
-        errorLine2="                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="476"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `play` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            play();"
-        errorLine2="            ~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="518"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `pause` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            pause();"
-        errorLine2="            ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="523"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `next` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            next();"
-        errorLine2="            ~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="528"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `previous` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            previous();"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="533"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `stop` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            stop();"
-        errorLine2="            ~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="538"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `seekTo` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            seekTo((int) pos);"
-        errorLine2="            ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="545"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `fastForward` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            fastForward();"
-        errorLine2="            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="550"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `rewind` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            rewind();"
-        errorLine2="            ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="555"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `setShuffleMode` of class `MediaSessionService` requires synthetic accessor"
-        errorLine1="            setShuffleMode(shuffleMode);"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="565"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlaybackService` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mPlaybackService = binder.getService();"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="188"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlaybackService` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mPlaybackService.registerCallback(MusicPlayerFragment.this);"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="191"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlaybackService` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mPlaybackService.setMediaList(mSongMetaDataList, false);"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="197"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSongMetaDataList` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mPlaybackService.setMediaList(mSongMetaDataList, false);"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="197"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlaybackService` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mPlaybackService.setFastForwardSpeedFactors(fastForwardSpeed);"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="200"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlaybackService` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mPlaybackService.setRewindSpeedFactors(rewindSpeed);"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="201"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mMediaSession = mPlaybackService.getMediaSession();"
-        errorLine2="            ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="204"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlaybackService` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mMediaSession = mPlaybackService.getMediaSession();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="204"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mController` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mController = new MediaControllerCompat(MusicPlayerFragment.this.getActivity(),"
-        errorLine2="            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="206"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaSession` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="                    mMediaSession);"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="207"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAdapter` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mAdapter = new MediaControllerAdapter(mController);"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="208"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mController` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mAdapter = new MediaControllerAdapter(mController);"
-        errorLine2="                                                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="208"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `PlaybackBannerMusicPlayerControlGlue` requires synthetic accessor"
-        errorLine1="            mGlue = new PlaybackBannerMusicPlayerControlGlue&lt;>(getActivity(), fastForwardSpeed,"
-        errorLine2="                    ^">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="209"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mGlue` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mGlue = new PlaybackBannerMusicPlayerControlGlue&lt;>(getActivity(), fastForwardSpeed,"
-        errorLine2="            ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="209"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAdapter` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="                    mAdapter);"
-        errorLine2="                    ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="211"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mGlue` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mGlue.setHost(new PlaybackFragmentGlueHost(MusicPlayerFragment.this));"
-        errorLine2="            ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="215"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPlaybackService` of class `MusicPlayerFragment` requires synthetic accessor"
-        errorLine1="            mPlaybackService = null;"
-        errorLine2="            ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"
-            line="220"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);"
-        errorLine2="                                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="159"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="164"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(getDisplayTitle(mPhotoItem.getTitle()));"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="169"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_BACKGROUND_PLAYER` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    if (TEST_BACKGROUND_PLAYER) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="172"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                            mDetailsBackground.switchToVideo();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="175"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="185"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(getDisplayTitle(mPhotoItem.getTitle()));"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="188"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_BACKGROUND_PLAYER` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    if (TEST_BACKGROUND_PLAYER) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="189"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        mDetailsBackground.switchToVideo();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="191"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_BACKGROUND_PLAYER` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    if (TEST_BACKGROUND_PLAYER) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="197"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        mDetailsBackground.switchToVideo();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="198"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        getDisplayTitle(mPhotoItem.getTitle()));"
-        errorLine2="                                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="293"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        mPhotoItem.getImageResourceId(), context.getTheme()));"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="295"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionRent` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_RENT, mActionRent);"
-        errorLine2="                                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="299"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBuy` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_BUY, mActionBuy);"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="300"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="303"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="306"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBuy` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_BUY, mActionBuy);"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="307"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                mRowsAdapter.add(0, dor);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="315"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_SHARED_ELEMENT_TRANSITION` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                if (TEST_SHARED_ELEMENT_TRANSITION) {"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="317"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHelper` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    if (mHelper != null &amp;&amp; !mHelper.getAutoStartSharedElementTransition()) {"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="318"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHelper` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    if (mHelper != null &amp;&amp; !mHelper.getAutoStartSharedElementTransition()) {"
-        errorLine2="                                            ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="318"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHelper` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        mHelper.startPostponedEnterTransition();"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="319"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                    mRowsAdapter.add(new ListRow(header, listRowAdapter));"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="338"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsFragment` requires synthetic accessor"
-        errorLine1="                        mDetailsBackground.setCoverBitmap(bitmap);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="354"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);"
-        errorLine2="                                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="162"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="167"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(getDisplayTitle(mPhotoItem.getTitle()));"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="172"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_BACKGROUND_PLAYER` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    if (TEST_BACKGROUND_PLAYER) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="175"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                            mDetailsBackground.switchToVideo();"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="178"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    actions.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                             ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="188"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    dor.setItem(getDisplayTitle(mPhotoItem.getTitle()));"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="191"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_BACKGROUND_PLAYER` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    if (TEST_BACKGROUND_PLAYER) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="192"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        mDetailsBackground.switchToVideo();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="194"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_BACKGROUND_PLAYER` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    if (TEST_BACKGROUND_PLAYER) {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="200"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        mDetailsBackground.switchToVideo();"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="201"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        getDisplayTitle(mPhotoItem.getTitle()));"
-        errorLine2="                                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="296"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhotoItem` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        mPhotoItem.getImageResourceId(), context.getTheme()));"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="298"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionRent` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_RENT, mActionRent);"
-        errorLine2="                                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="302"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBuy` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_BUY, mActionBuy);"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="303"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="306"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionPlay` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_PLAY, mActionPlay);"
-        errorLine2="                                                 ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="309"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mActionBuy` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        adapter.set(ACTION_BUY, mActionBuy);"
-        errorLine2="                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="310"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                mRowsAdapter.add(0, dor);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="318"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TEST_SHARED_ELEMENT_TRANSITION` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                if (TEST_SHARED_ELEMENT_TRANSITION) {"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="320"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHelper` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    if (mHelper != null &amp;&amp; !mHelper.getAutoStartSharedElementTransition()) {"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="321"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHelper` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    if (mHelper != null &amp;&amp; !mHelper.getAutoStartSharedElementTransition()) {"
-        errorLine2="                                            ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="321"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHelper` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        mHelper.startPostponedEnterTransition();"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="322"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRowsAdapter` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                    mRowsAdapter.add(new ListRow(header, listRowAdapter));"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="341"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mDetailsBackground` of class `NewDetailsSupportFragment` requires synthetic accessor"
-        errorLine1="                        mDetailsBackground.setCoverBitmap(bitmap);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="357"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentAnimationView` of class `OnboardingDemoFragment` requires synthetic accessor"
-        errorLine1="                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="111"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `CONTENT_BACKGROUNDS` of class `OnboardingDemoFragment` requires synthetic accessor"
-        errorLine1="                mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]);"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="127"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentBackgroundView` of class `OnboardingDemoFragment` requires synthetic accessor"
-        errorLine1="                mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="127"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `CONTENT_ANIMATIONS` of class `OnboardingDemoFragment` requires synthetic accessor"
-        errorLine1="                mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]);"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="128"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentAnimationView` of class `OnboardingDemoFragment` requires synthetic accessor"
-        errorLine1="                mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="128"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentAnimationView` of class `OnboardingDemoFragment` requires synthetic accessor"
-        errorLine1="                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="135"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentAnimationView` of class `OnboardingDemoSupportFragment` requires synthetic accessor"
-        errorLine1="                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="114"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `CONTENT_BACKGROUNDS` of class `OnboardingDemoSupportFragment` requires synthetic accessor"
-        errorLine1="                mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]);"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="130"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentBackgroundView` of class `OnboardingDemoSupportFragment` requires synthetic accessor"
-        errorLine1="                mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="130"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `CONTENT_ANIMATIONS` of class `OnboardingDemoSupportFragment` requires synthetic accessor"
-        errorLine1="                mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]);"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="131"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentAnimationView` of class `OnboardingDemoSupportFragment` requires synthetic accessor"
-        errorLine1="                mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="131"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mContentAnimationView` of class `OnboardingDemoSupportFragment` requires synthetic accessor"
-        errorLine1="                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="138"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `sData` of class `PhotoDatabase` requires synthetic accessor"
-        errorLine1="                            for (int i = 0; i &lt; sData.length; ++i) {"
-        errorLine2="                                                ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"
-            line="48"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `sData` of class `PhotoDatabase` requires synthetic accessor"
-        errorLine1="                                PhotoItem dataItem = sData[i];"
-        errorLine2="                                                     ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"
-            line="49"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` constructor of class `PhotoItem` requires synthetic accessor"
-        errorLine1="            return new PhotoItem(in);"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="84"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHandler` of class `PlaybackControlGlue` requires synthetic accessor"
-        errorLine1="            mHandler.postDelayed(this, getUpdatePeriod());"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackControlGlue.java"
-            line="59"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRepeatAction` of class `PlaybackControlGlue` requires synthetic accessor"
-        errorLine1="                if (mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.INDEX_NONE) {"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackControlGlue.java"
-            line="221"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStartPosition` of class `PlaybackControlGlue` requires synthetic accessor"
-        errorLine1="                mStartPosition = 0;"
-        errorLine2="                ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackControlGlue.java"
-            line="226"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `MediaSessionCallback` requires synthetic accessor"
-        errorLine1="        mMediaSessionCompat.setCallback(new MediaSessionCallback());"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlGlueSample.java"
-            line="147"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRepeatAction` of class `PlaybackTransportControlGlueSample` requires synthetic accessor"
-        errorLine1="                if (mRepeatAction.getIndex() != PlaybackControlsRow.RepeatAction.INDEX_NONE) {"
-        errorLine2="                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlGlueSample.java"
-            line="212"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mHandler` of class `PlayerAdapter` requires synthetic accessor"
-        errorLine1="            mHandler.postDelayed(this, 16);"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlayerAdapter.java"
-            line="34"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStartPosition` of class `PlayerAdapter` requires synthetic accessor"
-        errorLine1="                mStartPosition = 0;"
-        errorLine2="                ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlayerAdapter.java"
-            line="78"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mIsPlaying` of class `PlayerAdapter` requires synthetic accessor"
-        errorLine1="                mIsPlaying = false;"
-        errorLine2="                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PlayerAdapter.java"
-            line="79"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
-        errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/RowsFragment.java"
-            line="53"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTitleHelper` of class `RowsFragment` requires synthetic accessor"
-        errorLine1="                if (mTitleHelper != null) {"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/RowsFragment.java"
-            line="59"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTitleHelper` of class `RowsFragment` requires synthetic accessor"
-        errorLine1="                    mTitleHelper.showTitle(getAdapter() == null || getAdapter().size() == 0 ||"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/RowsFragment.java"
-            line="60"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
-        errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"
-            line="59"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTitleHelper` of class `RowsSupportFragment` requires synthetic accessor"
-        errorLine1="                if (mTitleHelper != null) {"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"
-            line="65"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTitleHelper` of class `RowsSupportFragment` requires synthetic accessor"
-        errorLine1="                    mTitleHelper.showTitle(getAdapter() == null || getAdapter().size() == 0 ||"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"
-            line="66"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.setSubtitle(&quot;Leanback artist Changed!&quot;);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoFragment.java"
-            line="119"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.setTitle(&quot;Leanback team at work&quot;);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoFragment.java"
-            line="120"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath));"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoFragment.java"
-            line="123"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoFragment` requires synthetic accessor"
-        errorLine1="                    loadSeekData(mMediaPlayerGlue);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoFragment.java"
-            line="124"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoFragment` requires synthetic accessor"
-        errorLine1="                    playWhenReady(mMediaPlayerGlue);"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoFragment.java"
-            line="125"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.removePlayerCallback(this);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoFragment.java"
-            line="127"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoSupportFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.setSubtitle(&quot;Leanback artist Changed!&quot;);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java"
-            line="122"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoSupportFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.setTitle(&quot;Leanback team at work&quot;);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java"
-            line="123"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoSupportFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath));"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java"
-            line="126"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoSupportFragment` requires synthetic accessor"
-        errorLine1="                    loadSeekData(mMediaPlayerGlue);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java"
-            line="127"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoSupportFragment` requires synthetic accessor"
-        errorLine1="                    playWhenReady(mMediaPlayerGlue);"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java"
-            line="128"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mMediaPlayerGlue` of class `SampleVideoSupportFragment` requires synthetic accessor"
-        errorLine1="                    mMediaPlayerGlue.removePlayerCallback(this);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java"
-            line="130"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `DEBUG` of class `SearchActivity` requires synthetic accessor"
-        errorLine1="                    if (DEBUG) Log.v(TAG, &quot;recognizeSpeech&quot;);"
-        errorLine2="                        ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchActivity.java"
-            line="49"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mFragment` of class `SearchActivity` requires synthetic accessor"
-        errorLine1="                    startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH);"
-        errorLine2="                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchActivity.java"
-            line="50"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
-        errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchFragment.java"
-            line="98"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `loadRows` of class `SearchFragment` requires synthetic accessor"
-        errorLine1="            loadRows();"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchFragment.java"
-            line="161"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `DEBUG` of class `SearchSupportActivity` requires synthetic accessor"
-        errorLine1="                    if (DEBUG) Log.v(TAG, &quot;recognizeSpeech&quot;);"
-        errorLine2="                        ~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchSupportActivity.java"
-            line="52"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mFragment` of class `SearchSupportActivity` requires synthetic accessor"
-        errorLine1="                    startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH);"
-        errorLine2="                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchSupportActivity.java"
-            line="53"
-            column="44"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `ItemViewClickedListener` requires synthetic accessor"
-        errorLine1="        setOnItemViewClickedListener(new ItemViewClickedListener());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"
-            line="101"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `loadRows` of class `SearchSupportFragment` requires synthetic accessor"
-        errorLine1="            loadRows();"
-        errorLine2="            ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"
-            line="164"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `loadData` of class `VerticalGridFragment` requires synthetic accessor"
-        errorLine1="                loadData();"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"
-            line="70"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAdapter` of class `VerticalGridFragment` requires synthetic accessor"
-        errorLine1="                mAdapter.callNotifyChanged();"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"
-            line="103"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `loadData` of class `VerticalGridSupportFragment` requires synthetic accessor"
-        errorLine1="                loadData();"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"
-            line="73"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAdapter` of class `VerticalGridSupportFragment` requires synthetic accessor"
-        errorLine1="                mAdapter.callNotifyChanged();"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"
-            line="106"
-            column="17"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Bitmap getCache(Object token) {"
         errorLine2="               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="62"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Bitmap getCache(Object token) {"
         errorLine2="                               ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="62"
-            column="32"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 putCache(Object token, Bitmap bitmap) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="74"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 putCache(Object token, Bitmap bitmap) {"
         errorLine2="                                           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="74"
-            column="44"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 BitmapCache getInstance() {"
         errorLine2="                      ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="83"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public abstract void onBitmapLoaded(Bitmap bitmap);"
         errorLine2="                                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="95"
-            column="45"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public BackgroundHelper(Activity activity) {"
         errorLine2="                            ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="107"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 attachToView(View backgroundView) {"
         errorLine2="                             ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="217"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setBackground(Object imageToken) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="230"
-            column="31"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setDrawable(Drawable drawable) {"
         errorLine2="                            ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="267"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 loadBitmap(Object imageToken, BitmapLoadCallback callback) {"
         errorLine2="                           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="279"
-            column="28"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 loadBitmap(Object imageToken, BitmapLoadCallback callback) {"
         errorLine2="                                              ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"
-            line="279"
-            column="47"/>
+            file="src/main/java/com/example/android/leanback/BackgroundHelper.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseActivity.java"
-            line="22"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseAnimationActivity.java"
-            line="23"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseAnimationActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseAnimationFragment.java"
-            line="58"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseAnimationFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseErrorActivity.java"
-            line="31"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorActivity.java"
-            line="55"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
-        errorLine2="                                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorActivity.java"
-            line="55"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                                          ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorActivity.java"
-            line="55"
-            column="59"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="                    Bundle savedInstanceState) {"
-        errorLine2="                    ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorActivity.java"
-            line="56"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseErrorSupportActivity.java"
-            line="35"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"
-            line="59"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"
-            line="59"
-            column="34"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                                          ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"
-            line="59"
-            column="59"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                    Bundle savedInstanceState) {"
         errorLine2="                    ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"
-            line="60"
-            column="21"/>
+            file="src/main/java/com/example/android/leanback/BrowseErrorSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseFragment.java"
-            line="65"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView("
         errorLine2="           ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="139"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="140"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="                                     ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="140"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
-        errorLine2="                                                          ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="140"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Fragment createFragment(Object rowObj) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="258"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Fragment createFragment(Object rowObj) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="258"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public PageFragmentAdapterImpl(SampleFragment fragment) {"
         errorLine2="                                       ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="375"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView("
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="399"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
-        errorLine2="                      ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="400"
-            column="23"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="                                               ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="400"
-            column="48"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
-        errorLine2="                                                                    ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="400"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onViewCreated(View view, Bundle savedInstanceState) {"
-        errorLine2="                                  ~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="414"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onViewCreated(View view, Bundle savedInstanceState) {"
         errorLine2="                                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="414"
-            column="46"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MainFragmentAdapter getMainFragmentAdapter() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseFragment.java"
-            line="421"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseSupportActivity.java"
-            line="26"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseSupportAppCompatActivity.java"
-            line="29"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportAppCompatActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/BrowseSupportFragment.java"
-            line="68"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView("
         errorLine2="           ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="142"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="            ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="143"
-            column="13"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="                                     ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="143"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="                                                          ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="143"
-            column="59"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Fragment createFragment(Object rowObj) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="261"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Fragment createFragment(Object rowObj) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="261"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public PageFragmentAdapterImpl(SampleFragment fragment) {"
         errorLine2="                                       ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="378"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView("
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="402"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="                      ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="403"
-            column="23"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="                                               ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="403"
-            column="48"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {"
         errorLine2="                                                                    ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="403"
-            column="69"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onViewCreated(View view, Bundle savedInstanceState) {"
         errorLine2="                                  ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="417"
-            column="35"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onViewCreated(View view, Bundle savedInstanceState) {"
         errorLine2="                                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="417"
-            column="46"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public MainFragmentAdapter getMainFragmentAdapter() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"
-            line="424"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/BrowseSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public int getRowHeight(Context context) {"
         errorLine2="                            ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="73"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public int getExpandedRowHeight(Context context) {"
         errorLine2="                                    ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="78"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="           ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="84"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="                                         ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="84"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onBindViewHolder(ViewHolder viewHolder, Object item) {"
-        errorLine2="                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="111"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onBindViewHolder(ViewHolder viewHolder, Object item) {"
-        errorLine2="                                                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="111"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onBindViewHolder(ViewHolder viewHolder, Object item, List&lt;Object> payloads) {"
         errorLine2="                                 ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="125"
-            column="34"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onBindViewHolder(ViewHolder viewHolder, Object item, List&lt;Object> payloads) {"
         errorLine2="                                                        ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="125"
-            column="57"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onBindViewHolder(ViewHolder viewHolder, Object item, List&lt;Object> payloads) {"
         errorLine2="                                                                     ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="125"
-            column="70"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onUnbindViewHolder(ViewHolder viewHolder) {"
         errorLine2="                                   ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CardPresenter.java"
-            line="149"
-            column="36"/>
+            file="src/main/java/com/example/android/leanback/CardPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CustomTitleView(Context context) {"
         errorLine2="                           ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CustomTitleView.java"
-            line="73"
-            column="28"/>
+            file="src/main/java/com/example/android/leanback/CustomTitleView.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CustomTitleView(Context context, AttributeSet attrs) {"
         errorLine2="                           ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CustomTitleView.java"
-            line="77"
-            column="28"/>
+            file="src/main/java/com/example/android/leanback/CustomTitleView.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CustomTitleView(Context context, AttributeSet attrs) {"
         errorLine2="                                            ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CustomTitleView.java"
-            line="77"
-            column="45"/>
+            file="src/main/java/com/example/android/leanback/CustomTitleView.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CustomTitleView(Context context, AttributeSet attrs, int defStyleAttr) {"
         errorLine2="                           ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CustomTitleView.java"
-            line="81"
-            column="28"/>
+            file="src/main/java/com/example/android/leanback/CustomTitleView.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CustomTitleView(Context context, AttributeSet attrs, int defStyleAttr) {"
         errorLine2="                                            ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CustomTitleView.java"
-            line="81"
-            column="45"/>
+            file="src/main/java/com/example/android/leanback/CustomTitleView.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public TitleViewAdapter getTitleViewAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/CustomTitleView.java"
-            line="86"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/CustomTitleView.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/DatePickerActivity.java"
-            line="33"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/DatePickerActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/DatePickerAppCompatActivity.java"
-            line="33"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/DatePickerAppCompatActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/DetailsActivity.java"
-            line="35"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/DetailsActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onBindDescription(ViewHolder vh, Object item) {"
-        errorLine2="                                     ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsDescriptionPresenter.java"
-            line="21"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onBindDescription(ViewHolder vh, Object item) {"
-        errorLine2="                                                    ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsDescriptionPresenter.java"
-            line="21"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/DetailsFragment.java"
-            line="68"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/DetailsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onSaveInstanceState(Bundle outState) {"
-        errorLine2="                                    ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="171"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setItem(PhotoItem photoItem) {"
         errorLine2="                        ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsFragment.java"
-            line="176"
-            column="25"/>
+            file="src/main/java/com/example/android/leanback/DetailsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="48"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="70"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="70"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public GuidanceStylist onCreateGuidanceStylist() {"
         errorLine2="               ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="79"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="89"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="89"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"
-            line="107"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/DetailsPresenterSelectionActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/DetailsSupportActivity.java"
-            line="39"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/DetailsSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/DetailsSupportFragment.java"
-            line="71"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onSaveInstanceState(Bundle outState) {"
-        errorLine2="                                    ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="174"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setItem(PhotoItem photoItem) {"
         errorLine2="                        ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"
-            line="179"
-            column="25"/>
+            file="src/main/java/com/example/android/leanback/DetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/ErrorFragment.java"
-            line="28"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/ErrorFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/ErrorSupportFragment.java"
-            line="31"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/ErrorSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="73"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onConfigurationChanged(Configuration newConfig) {"
         errorLine2="                                       ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="84"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSaveInstanceState(Bundle outState) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="90"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onRestoreInstanceState(Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="96"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="197"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="197"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="208"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="208"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="225"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 savedInstance) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="270"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="280"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="280"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="291"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="291"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="299"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="299"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="307"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public long onGuidedActionEditedAndProceed(GuidedAction action) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="328"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public GuidedActionsStylist onCreateActionsStylist() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="392"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="408"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="408"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="419"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="419"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="429"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="429"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="438"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public long onGuidedActionEditedAndProceed(GuidedAction action) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="460"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public boolean onSubGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="480"
-            column="49"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="503"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
-        errorLine2="                                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="503"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                                          ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="503"
-            column="59"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="                Bundle savedInstanceState) {"
-        errorLine2="                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="504"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="536"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="536"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public GuidanceStylist onCreateGuidanceStylist() {"
         errorLine2="               ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="547"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="557"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="557"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="584"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="584"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="591"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="619"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="619"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="630"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="630"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"
-            line="639"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="42"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="52"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="52"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="63"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="63"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="91"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="109"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="109"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="120"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="120"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="133"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="133"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"
-            line="141"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="76"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onConfigurationChanged(Configuration newConfig) {"
         errorLine2="                                       ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="86"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onSaveInstanceState(Bundle outState) {"
         errorLine2="                                       ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="92"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onRestoreInstanceState(Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="98"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="               ~~~~~~~~">
+        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 onCreateActions(@NonNull List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
+        errorLine2="                                                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="199"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="                                         ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="199"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="210"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="210"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="227"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 savedInstance) {"
         errorLine2="                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="272"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="282"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="282"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
+        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 onCreateActions(@NonNull List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
+        errorLine2="                                                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="293"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="293"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="301"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="301"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="309"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public long onGuidedActionEditedAndProceed(GuidedAction action) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="330"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public GuidedActionsStylist onCreateActionsStylist() {"
         errorLine2="               ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="394"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="410"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="410"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
+        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 onCreateActions(@NonNull List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
+        errorLine2="                                                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="421"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="421"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="431"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="431"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="440"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public long onGuidedActionEditedAndProceed(GuidedAction action) {"
         errorLine2="                                                   ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="462"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public boolean onSubGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                                ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="482"
-            column="49"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="               ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="505"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                 ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="505"
-            column="34"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                                          ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="505"
-            column="59"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                Bundle savedInstanceState) {"
         errorLine2="                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="506"
-            column="17"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="538"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="538"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public GuidanceStylist onCreateGuidanceStylist() {"
         errorLine2="               ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="549"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
+        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 onCreateActions(@NonNull List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
+        errorLine2="                                                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="559"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="559"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="586"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="586"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="593"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="621"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="621"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
+        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 onCreateActions(@NonNull List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
+        errorLine2="                                                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="632"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="632"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"
-            line="641"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="45"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="55"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="55"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="66"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="66"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="94"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="112"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="112"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
+        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 onCreateActions(@NonNull List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
+        errorLine2="                                                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="123"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public void onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
-        errorLine2="                                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="123"
-            column="65"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                          ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="136"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateButtonActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                      ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="136"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"
-            line="144"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="74"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onNewIntent(Intent intent) {"
-        errorLine2="                               ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/HorizontalGridTestActivity.java"
-            line="88"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public LiveDataListRow(HeaderItem header,"
         errorLine2="                           ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"
-            line="24"
-            column="28"/>
+            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            ObjectAdapter adapter) {"
         errorLine2="            ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"
-            line="25"
-            column="13"/>
+            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public LiveDataListRow(long id, HeaderItem header, ObjectAdapter adapter) {"
         errorLine2="                                    ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"
-            line="28"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public LiveDataListRow(long id, HeaderItem header, ObjectAdapter adapter) {"
         errorLine2="                                                       ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"
-            line="28"
-            column="56"/>
+            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public LiveDataListRow(ObjectAdapter adapter) {"
         errorLine2="                           ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"
-            line="31"
-            column="28"/>
+            file="src/main/java/com/example/android/leanback/LiveDataListRow.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/MainActivity.java"
-            line="39"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/MainActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="               ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MainActivity.java"
-            line="48"
-            column="16"/>
+            file="src/main/java/com/example/android/leanback/MainActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public Guidance onCreateGuidance(Bundle savedInstanceState) {"
         errorLine2="                                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MainActivity.java"
-            line="48"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/MainActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MainActivity.java"
-            line="59"
-            column="37"/>
+            file="src/main/java/com/example/android/leanback/MainActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreateActions(List&lt;GuidedAction> actions, Bundle savedInstanceState) {"
         errorLine2="                                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MainActivity.java"
-            line="59"
-            column="65"/>
+            file="src/main/java/com/example/android/leanback/MainActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onGuidedActionClicked(GuidedAction action) {"
         errorLine2="                                          ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MainActivity.java"
-            line="190"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/MainActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public MediaSessionCompat getMediaSession() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="202"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public IBinder onBind(Intent intent) {"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="208"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setMediaList(List&lt;MusicItem> mediaItemList, boolean isQueue) {"
         errorLine2="                             ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="261"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setFastForwardSpeedFactors(int[] fastForwardSpeeds) {"
         errorLine2="                                           ~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="291"
-            column="44"/>
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setRewindSpeedFactors(int[] rewindSpeeds) {"
         errorLine2="                                      ~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="307"
-            column="39"/>
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 registerCallback(MediaPlayerListener listener) {"
         errorLine2="                                 ~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MediaSessionService.java"
-            line="488"
-            column="34"/>
+            file="src/main/java/com/example/android/leanback/MediaSessionService.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    @Override public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                                   ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicExampleActivity.java"
-            line="26"
-            column="36"/>
+            file="src/main/java/com/example/android/leanback/MusicExampleActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Uri getMediaSourceUri(Context context) {"
         errorLine2="           ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicItem.java"
-            line="56"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/MusicItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public Uri getMediaSourceUri(Context context) {"
         errorLine2="                                 ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicItem.java"
-            line="56"
-            column="34"/>
+            file="src/main/java/com/example/android/leanback/MusicItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getMediaTitle() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicItem.java"
-            line="66"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/MusicItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getMediaDescription() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicItem.java"
-            line="75"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/MusicItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public int getMediaAlbumArtResId(Context context) {"
         errorLine2="                                     ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicItem.java"
-            line="85"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/MusicItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Uri getResourceUri(Context context, int resID) {"
         errorLine2="                  ~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicItem.java"
-            line="97"
-            column="19"/>
+            file="src/main/java/com/example/android/leanback/MusicItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 Uri getResourceUri(Context context, int resID) {"
         errorLine2="                                     ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/MusicItem.java"
-            line="97"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/MusicItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/MusicPlayerFragment.java"
-            line="225"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/MusicPlayerFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/NewDetailsFragment.java"
-            line="115"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="           ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="250"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
-        errorLine2="                             ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="250"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                                      ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="250"
-            column="55"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            Bundle savedInstanceState) {"
-        errorLine2="            ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="251"
-            column="13"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setItem(PhotoItem photoItem) {"
         errorLine2="                        ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"
-            line="260"
-            column="25"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/NewDetailsSupportFragment.java"
-            line="118"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="           ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="253"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="253"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                                      ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="253"
-            column="55"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            Bundle savedInstanceState) {"
         errorLine2="            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="254"
-            column="13"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setItem(PhotoItem photoItem) {"
         errorLine2="                        ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"
-            line="263"
-            column="25"/>
+            file="src/main/java/com/example/android/leanback/NewDetailsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/OnboardingActivity.java"
-            line="21"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/OnboardingActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onAttach(android.app.Activity activity) {"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="57"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected CharSequence getPageTitle(int i) {"
         errorLine2="              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="70"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected CharSequence getPageDescription(int i) {"
         errorLine2="              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="75"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="              ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="80"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="                                          ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="80"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="                                                                         ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="80"
-            column="74"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="              ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="86"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="                                       ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="86"
-            column="40"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="                                                                      ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="86"
-            column="71"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="              ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="94"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="                                          ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="94"
-            column="43"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
         errorLine2="                                                                         ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="94"
-            column="74"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected Animator onCreateEnterAnimation() {"
         errorLine2="              ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"
-            line="99"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onAttach(android.app.Activity activity) {"
         errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="60"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected CharSequence getPageTitle(int i) {"
         errorLine2="              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="73"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected CharSequence getPageDescription(int i) {"
         errorLine2="              ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="78"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected View onCreateBackgroundView("
         errorLine2="              ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="83"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="83"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
-        errorLine2="                                                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="83"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected View onCreateContentView("
         errorLine2="              ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="89"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="89"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
-        errorLine2="                                                                      ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="89"
-            column="71"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected View onCreateForegroundView("
         errorLine2="              ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="97"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
-        errorLine2="                                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="97"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {"
-        errorLine2="                                                                         ~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="97"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected Animator onCreateEnterAnimation() {"
         errorLine2="              ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"
-            line="102"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/OnboardingDemoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/OnboardingSupportActivity.java"
-            line="25"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/OnboardingSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/OnboardingSupportAppCompatActivity.java"
-            line="28"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/OnboardingSupportAppCompatActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected LiveDataRowPresenterViewHolder createRowViewHolder(ViewGroup parent) {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PagedRowPresenter.java"
-            line="39"
-            column="15"/>
+            file="src/main/java/com/example/android/leanback/PagedRowPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected LiveDataRowPresenterViewHolder createRowViewHolder(ViewGroup parent) {"
         errorLine2="                                                                 ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PagedRowPresenter.java"
-            line="39"
-            column="66"/>
+            file="src/main/java/com/example/android/leanback/PagedRowPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PagedRowPresenter.java"
-            line="48"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {"
-        errorLine2="                                                                       ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/PagedRowPresenter.java"
-            line="48"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PagerAdapter(FragmentManager fm, int numOfTabs) {"
         errorLine2="                        ~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PagerAdapter.java"
-            line="30"
-            column="25"/>
+            file="src/main/java/com/example/android/leanback/PagerAdapter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public CharSequence getPageTitle(int position) {"
         errorLine2="           ~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PagerAdapter.java"
-            line="47"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PagerAdapter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getTitle() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/room/Photo.java"
-            line="42"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/room/Photo.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    PagingSource&lt;Integer, Photo> fetchPhotos();"
         errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/room/PhotoDao.java"
-            line="32"
-            column="5"/>
+            file="src/main/java/com/example/android/leanback/room/PhotoDao.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 synchronized PhotoDatabase getInstance("
         errorLine2="                               ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"
-            line="40"
-            column="32"/>
+            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            Context context) {"
         errorLine2="            ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"
-            line="41"
-            column="13"/>
+            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public abstract PhotoDao photoDao();"
         errorLine2="                    ~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"
-            line="85"
-            column="21"/>
+            file="src/main/java/com/example/android/leanback/room/PhotoDatabase.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PhotoItem(String title, int imageResourceId) {"
         errorLine2="                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="30"
-            column="22"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PhotoItem(String title, int imageResourceId, int id) {"
         errorLine2="                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="34"
-            column="22"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PhotoItem(String title, String content, int imageResourceId) {"
         errorLine2="                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="39"
-            column="22"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PhotoItem(String title, String content, int imageResourceId) {"
         errorLine2="                                   ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="39"
-            column="36"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PhotoItem(String title, String content, int imageResourceId, int id) {"
         errorLine2="                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="47"
-            column="22"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PhotoItem(String title, String content, int imageResourceId, int id) {"
         errorLine2="                                   ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="47"
-            column="36"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getTitle() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="56"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public String getContent() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="60"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 writeToParcel(Parcel dest, int flags) {"
         errorLine2="                              ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoItem.java"
-            line="75"
-            column="31"/>
+            file="src/main/java/com/example/android/leanback/PhotoItem.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public PhotoViewModel(Application application) {"
         errorLine2="                          ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoViewModel.java"
-            line="44"
-            column="27"/>
+            file="src/main/java/com/example/android/leanback/PhotoViewModel.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public LiveData&lt;PagingData&lt;PhotoItem>> getPagingDataLiveData() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PhotoViewModel.java"
-            line="64"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PhotoViewModel.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/PinPickerActivity.java"
-            line="30"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/PinPickerActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackActivity.java"
-            line="33"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 registerPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackActivity.java"
-            line="48"
-            column="50"/>
+            file="src/main/java/com/example/android/leanback/PlaybackActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 unregisterPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackActivity.java"
-            line="55"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/PlaybackActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public SparseArrayObjectAdapter getAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackFragment.java"
-            line="61"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PlaybackFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackFragment.java"
-            line="66"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected boolean isCancelled(Object task) {"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"
-            line="48"
-            column="35"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected abstract Bitmap doInBackground(Object task, int index, long position);"
         errorLine2="                       ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"
-            line="52"
-            column="24"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected abstract Bitmap doInBackground(Object task, int index, long position);"
         errorLine2="                                             ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"
-            line="52"
-            column="46"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setSeekPositions(long[] positions) {"
         errorLine2="                                 ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"
-            line="93"
-            column="34"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public long[] getSeekPositions() {"
         errorLine2="           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"
-            line="98"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 getThumbnail(int index, ResultCallback callback) {"
         errorLine2="                                        ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"
-            line="104"
-            column="41"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSeekAsyncDataProvider.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackSupportActivity.java"
-            line="37"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 registerPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSupportActivity.java"
-            line="52"
-            column="50"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 unregisterPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSupportActivity.java"
-            line="59"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public SparseArrayObjectAdapter getAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackSupportFragment.java"
-            line="64"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackSupportFragment.java"
-            line="69"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackTransportControlActivity.java"
-            line="33"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 registerPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlActivity.java"
-            line="48"
-            column="50"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 unregisterPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlActivity.java"
-            line="55"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public SparseArrayObjectAdapter getAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlFragment.java"
-            line="56"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackTransportControlFragment.java"
-            line="61"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackTransportControlSupportActivity.java"
-            line="37"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 registerPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportActivity.java"
-            line="52"
-            column="50"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 unregisterPictureInPictureListener(PictureInPictureListener listener) {"
         errorLine2="                                                   ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportActivity.java"
-            line="59"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public SparseArrayObjectAdapter getAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportFragment.java"
-            line="59"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/PlaybackTransportControlSupportFragment.java"
-            line="64"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/PlaybackTransportControlSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/RowsActivity.java"
-            line="31"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/RowsActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setTitleHelper(TitleHelper titleHelper) {"
         errorLine2="                               ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/RowsFragment.java"
-            line="43"
-            column="32"/>
+            file="src/main/java/com/example/android/leanback/RowsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/RowsFragment.java"
-            line="48"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/RowsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/RowsSupportActivity.java"
-            line="34"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/RowsSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 setTitleHelper(TitleHelper titleHelper) {"
         errorLine2="                               ~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"
-            line="50"
-            column="32"/>
+            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/RowsSupportFragment.java"
-            line="55"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/RowsSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SampleVideoFragment.java"
-            line="100"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/SampleVideoFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SampleVideoSupportFragment.java"
-            line="103"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/SampleVideoSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SearchActivity.java"
-            line="38"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/SearchActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onActivityResult(int requestCode, int resultCode, Intent data) {"
-        errorLine2="                                                                     ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchActivity.java"
-            line="58"
-            column="70"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SearchFragment.java"
-            line="88"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/SearchFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ObjectAdapter getResultsAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchFragment.java"
-            line="102"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/SearchFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean onQueryTextChange(String newQuery) {"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchFragment.java"
-            line="107"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/SearchFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean onQueryTextSubmit(String query) {"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchFragment.java"
-            line="115"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/SearchFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SearchSupportActivity.java"
-            line="41"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/SearchSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onActivityResult(int requestCode, int resultCode, Intent data) {"
-        errorLine2="                                                                     ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/SearchSupportActivity.java"
-            line="61"
-            column="70"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SearchSupportFragment.java"
-            line="91"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ObjectAdapter getResultsAdapter() {"
         errorLine2="           ~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"
-            line="105"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean onQueryTextChange(String newQuery) {"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"
-            line="110"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean onQueryTextSubmit(String query) {"
         errorLine2="                                     ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"
-            line="118"
-            column="38"/>
+            file="src/main/java/com/example/android/leanback/SearchSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SettingsActivity.java"
-            line="27"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/SettingsActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean onPreferenceStartFragment(PreferenceFragmentCompat preferenceFragment,"
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SettingsFragment.java"
-            line="44"
-            column="46"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                                             Preference preference) {"
         errorLine2="                                             ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SettingsFragment.java"
-            line="45"
-            column="46"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragment,"
         errorLine2="                                           ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SettingsFragment.java"
-            line="50"
-            column="44"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="                                           PreferenceScreen preferenceScreen) {"
         errorLine2="                                           ~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SettingsFragment.java"
-            line="51"
-            column="44"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/SettingsFragment.java"
-            line="70"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreatePreferences(Bundle bundle, String rootKey) {"
         errorLine2="                                        ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SettingsFragment.java"
-            line="75"
-            column="41"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onCreatePreferences(Bundle bundle, String rootKey) {"
         errorLine2="                                                       ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SettingsFragment.java"
-            line="75"
-            column="56"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="        public boolean onPreferenceTreeClick(Preference preference) {"
         errorLine2="                                             ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/SettingsFragment.java"
-            line="80"
-            column="46"/>
+            file="src/main/java/com/example/android/leanback/SettingsFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="           ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/StringPresenter.java"
-            line="28"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/StringPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ViewHolder onCreateViewHolder(ViewGroup parent) {"
         errorLine2="                                         ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/StringPresenter.java"
-            line="28"
-            column="42"/>
+            file="src/main/java/com/example/android/leanback/StringPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onBindViewHolder(ViewHolder viewHolder, Object item) {"
-        errorLine2="                                 ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/StringPresenter.java"
-            line="40"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onBindViewHolder(ViewHolder viewHolder, Object item) {"
-        errorLine2="                                                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/StringPresenter.java"
-            line="40"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 onUnbindViewHolder(ViewHolder viewHolder) {"
         errorLine2="                                   ~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/StringPresenter.java"
-            line="46"
-            column="36"/>
+            file="src/main/java/com/example/android/leanback/StringPresenter.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="           ~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/TabFragment.java"
-            line="37"
-            column="12"/>
+            file="src/main/java/com/example/android/leanback/TabFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                             ~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/TabFragment.java"
-            line="37"
-            column="30"/>
+            file="src/main/java/com/example/android/leanback/TabFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public View onCreateView(LayoutInflater inflater, ViewGroup container,"
         errorLine2="                                                      ~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/TabFragment.java"
-            line="37"
-            column="55"/>
+            file="src/main/java/com/example/android/leanback/TabFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="            Bundle savedInstanceState) {"
         errorLine2="            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/TabFragment.java"
-            line="38"
-            column="13"/>
+            file="src/main/java/com/example/android/leanback/TabFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/TabLayoutActivity.java"
-            line="32"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/TabLayoutActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/TimePickerActivity.java"
-            line="34"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/TimePickerActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/VerticalGridActivity.java"
-            line="23"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/VerticalGridFragment.java"
-            line="50"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/VerticalGridSupportActivity.java"
-            line="27"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/VerticalGridSupportAppCompatActivity.java"
-            line="29"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridSupportAppCompatActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/VerticalGridSupportFragment.java"
-            line="53"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/VerticalGridSupportFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/VideoActivity.java"
-            line="25"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/VideoActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/VideoActivityWithDetailedCard.java"
-            line="37"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/VideoActivityWithDetailedCard.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    protected void onNewIntent(Intent intent) {"
-        errorLine2="                               ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/leanback/VideoActivityWithDetailedCard.java"
-            line="50"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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 boolean supportsPictureInPicture(Context context) {"
         errorLine2="                                                   ~~~~~~~">
         <location
-            file="src/main/java/com/example/android/leanback/VideoActivityWithDetailedCard.java"
-            line="65"
-            column="52"/>
+            file="src/main/java/com/example/android/leanback/VideoActivityWithDetailedCard.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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/android/leanback/VideoConsumptionWithDetailCardFragment.java"
-            line="66"
-            column="26"/>
+            file="src/main/java/com/example/android/leanback/VideoConsumptionWithDetailCardFragment.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/VideoSupportActivity.java"
-            line="29"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/VideoSupportActivity.java"/>
     </issue>
 
     <issue
         id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+        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
-            file="src/main/java/com/example/android/leanback/VideoSupportAppCompatActivity.java"
-            line="29"
-            column="29"/>
+            file="src/main/java/com/example/android/leanback/VideoSupportAppCompatActivity.java"/>
     </issue>
 
 </issues>
diff --git a/samples/SupportPreferenceDemos/lint-baseline.xml b/samples/SupportPreferenceDemos/lint-baseline.xml
index 653f759..a2a2fdc 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.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="MissingTvBanner"
diff --git a/samples/SupportRemoteCallbackDemos/lint-baseline.xml b/samples/SupportRemoteCallbackDemos/lint-baseline.xml
index 2118d29..95c283f 100644
--- a/samples/SupportRemoteCallbackDemos/lint-baseline.xml
+++ b/samples/SupportRemoteCallbackDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="cli" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/samples/SupportSliceDemos/lint-baseline.xml b/samples/SupportSliceDemos/lint-baseline.xml
index 722853d..128542c 100644
--- a/samples/SupportSliceDemos/lint-baseline.xml
+++ b/samples/SupportSliceDemos/lint-baseline.xml
@@ -1,95 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAdapter` of class `SliceBrowser` requires synthetic accessor"
-        errorLine1="                mSearchView.setQuery(((Cursor) mAdapter.getItem(position)).getString(1), true);"
-        errorLine2="                                               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceBrowser.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSearchView` of class `SliceBrowser` requires synthetic accessor"
-        errorLine1="                mSearchView.setQuery(((Cursor) mAdapter.getItem(position)).getString(1), true);"
-        errorLine2="                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceBrowser.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mAdapter` of class `SliceBrowser` requires synthetic accessor"
-        errorLine1="                mSearchView.setQuery(((Cursor) mAdapter.getItem(position)).getString(1), true);"
-        errorLine2="                                               ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceBrowser.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSearchView` of class `SliceBrowser` requires synthetic accessor"
-        errorLine1="                mSearchView.setQuery(((Cursor) mAdapter.getItem(position)).getString(1), true);"
-        errorLine2="                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceBrowser.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addSlice` of class `SliceBrowser` requires synthetic accessor"
-        errorLine1="                addSlice(Uri.parse(s));"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceBrowser.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mSearchView` of class `SliceBrowser` requires synthetic accessor"
-        errorLine1="                mSearchView.clearFocus();"
-        errorLine2="                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceBrowser.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `populateAdapter` of class `SliceBrowser` requires synthetic accessor"
-        errorLine1="                populateAdapter(s);"
-        errorLine2="                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceBrowser.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `IconCache` requires synthetic accessor"
-        errorLine1="        IconCache cache = new IconCache();"
-        errorLine2="                          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceSelectionDialog.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `getType` of class `ProviderTypeCache` requires synthetic accessor"
-        errorLine1="                    if (SliceProvider.SLICE_TYPE.equals(typeCache.getType(provider))) {"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceSelectionDialog.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `loadIcon` of class `IconCache` requires synthetic accessor"
-        errorLine1="                        cache.loadIcon(iv, provider, pm);"
-        errorLine2="                        ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/slice/demos/SliceSelectionDialog.java"/>
-    </issue>
+<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/samples/SupportTransitionDemos/lint-baseline.xml b/samples/SupportTransitionDemos/lint-baseline.xml
index 6a1914f..49f9969 100644
--- a/samples/SupportTransitionDemos/lint-baseline.xml
+++ b/samples/SupportTransitionDemos/lint-baseline.xml
@@ -1,266 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRoot` of class `ArcMotionUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, mTransition);"
-        errorLine2="                                                         ~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTransition` of class `ArcMotionUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, mTransition);"
-        errorLine2="                                                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTarget` of class `ArcMotionUsage` requires synthetic accessor"
-        errorLine1="                FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mTarget.getLayoutParams();"
-        errorLine2="                                                                         ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTarget` of class `ArcMotionUsage` requires synthetic accessor"
-        errorLine1="                mTarget.setLayoutParams(lp);"
-        errorLine2="                ~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `toggle` of class `BeginDelayedUsage` requires synthetic accessor"
-        errorLine1="                toggle();"
-        errorLine2="                ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/BeginDelayedUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `TRANSITION` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, TRANSITION);"
-        errorLine2="                                                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRoot` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, TRANSITION);"
-        errorLine2="                                                         ~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhoto` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                        mPhoto.setScaleType(ImageView.ScaleType.FIT_XY);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhoto` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                        mPhoto.setScaleType(ImageView.ScaleType.CENTER);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhoto` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                        mPhoto.setScaleType(ImageView.ScaleType.CENTER_CROP);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhoto` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                        mPhoto.setScaleType(ImageView.ScaleType.FIT_START);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhoto` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                        mPhoto.setScaleType(ImageView.ScaleType.FIT_END);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhoto` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                        mPhoto.setScaleType(ImageView.ScaleType.MATRIX);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mPhoto` of class `ChangeImageTransformUsage` requires synthetic accessor"
-        errorLine1="                        mPhoto.setImageMatrix(matrix);"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeImageTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mChangeTransform` of class `ChangeTransformUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, mChangeTransform);"
-        errorLine2="                                                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRoot` of class `ChangeTransformUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, mChangeTransform);"
-        errorLine2="                                                         ~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mExplode` of class `ExplodeUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, mExplode);"
-        errorLine2="                                                                ~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ExplodeUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRoot` of class `ExplodeUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRoot, mExplode);"
-        errorLine2="                                                         ~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ExplodeUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mViews` of class `ExplodeUsage` requires synthetic accessor"
-        errorLine1="                int vis = mViews.get(0).getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE;"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ExplodeUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mViews` of class `ExplodeUsage` requires synthetic accessor"
-        errorLine1="                for (View view : mViews) {"
-        errorLine2="                                 ~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ExplodeUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `SHARED_TRANSITION` of class `FragmentTransitionUsage` requires synthetic accessor"
-        errorLine1="            setSharedElementEnterTransition(SHARED_TRANSITION);"
-        errorLine2="                                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `SHARED_TRANSITION` of class `FragmentTransitionUsage` requires synthetic accessor"
-        errorLine1="            setSharedElementReturnTransition(SHARED_TRANSITION);"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `NON_SHARED_TRANSITION` of class `FragmentTransitionUsage` requires synthetic accessor"
-        errorLine1="            setExitTransition(NON_SHARED_TRANSITION);"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `NON_SHARED_TRANSITION` of class `FragmentTransitionUsage` requires synthetic accessor"
-        errorLine1="            setEnterTransition(NON_SHARED_TRANSITION);"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `NON_SHARED_TRANSITION` of class `FragmentTransitionUsage` requires synthetic accessor"
-        errorLine1="            setReenterTransition(NON_SHARED_TRANSITION);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `NON_SHARED_TRANSITION` of class `FragmentTransitionUsage` requires synthetic accessor"
-        errorLine1="            setReturnTransition(NON_SHARED_TRANSITION);"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mRecyclerView` of class `RecyclerViewUsage` requires synthetic accessor"
-        errorLine1="                TransitionManager.beginDelayedTransition(mRecyclerView,"
-        errorLine2="                                                         ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/RecyclerViewUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addImageView` of class `ReparentImageUsage` requires synthetic accessor"
-        errorLine1="                    addImageView(mOuterFrame, ImageView.ScaleType.CENTER_CROP, mPhotoSize);"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ReparentImageUsage.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `addImageView` of class `ReparentImageUsage` requires synthetic accessor"
-        errorLine1="                    addImageView(mInnerFrame, ImageView.ScaleType.FIT_XY,"
-        errorLine2="                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/transition/widget/ReparentImageUsage.java"/>
-    </issue>
+<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 7c40746..66e9a6c 100644
--- a/samples/SupportWearDemos/lint-baseline.xml
+++ b/samples/SupportWearDemos/lint-baseline.xml
@@ -1,86 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStateTextView` of class `AmbientModeDemo` requires synthetic accessor"
-        errorLine1="            mStateTextView.setText(&quot;Ambient&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStateTextView` of class `AmbientModeDemo` requires synthetic accessor"
-        errorLine1="            mStateTextView.setTextColor(Color.WHITE);"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStateTextView` of class `AmbientModeDemo` requires synthetic accessor"
-        errorLine1="            mStateTextView.getPaint().setAntiAlias(false);"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStateTextView` of class `AmbientModeDemo` requires synthetic accessor"
-        errorLine1="            mStateTextView.setText(&quot;Interactive&quot;);"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStateTextView` of class `AmbientModeDemo` requires synthetic accessor"
-        errorLine1="            mStateTextView.setTextColor(Color.GREEN);"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mStateTextView` of class `AmbientModeDemo` requires synthetic accessor"
-        errorLine1="            mStateTextView.getPaint().setAntiAlias(true);"
-        errorLine2="            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/AmbientModeDemo.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mData` of class `DemoAdapter` requires synthetic accessor"
-        errorLine1="                    startActivity(mData.get(mKeys[position]));"
-        errorLine2="                                  ~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/MainDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mKeys` of class `DemoAdapter` requires synthetic accessor"
-        errorLine1="                    startActivity(mData.get(mKeys[position]));"
-        errorLine2="                                            ~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/MainDemoActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` member of class `DemoAdapter` requires synthetic accessor"
-        errorLine1="        wrv.setAdapter(new DemoAdapter());"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/android/support/wear/app/SimpleWearableRecyclerViewDemo.java"/>
-    </issue>
+<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/settings.gradle b/settings.gradle
index 212e59b..6184bf2 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -769,6 +769,9 @@
 includeProject(":preference:preference", [BuildType.MAIN])
 includeProject(":preference:preference-ktx", [BuildType.MAIN])
 includeProject(":print:print", [BuildType.MAIN])
+includeProject(":privacysandbox:tools:tools", [BuildType.MAIN])
+includeProject(":privacysandbox:tools:tools-apicompiler", [BuildType.MAIN])
+includeProject(":privacysandbox:tools:tools-apigenerator", [BuildType.MAIN])
 includeProject(":profileinstaller:profileinstaller", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":profileinstaller:integration-tests:init-macrobenchmark", [BuildType.MAIN])
 includeProject(":profileinstaller:integration-tests:init-macrobenchmark-target", [BuildType.MAIN])
@@ -837,7 +840,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-proto", "test/screenshot/screenshot/proto")
+includeProject(":test:screenshot:screenshot-proto")
 includeProject(":test:uiautomator:uiautomator", [BuildType.MAIN])
 includeProject(":test:uiautomator:integration-tests:testapp", [BuildType.MAIN])
 includeProject(":text:text", [BuildType.COMPOSE])
diff --git a/sharetarget/integration-tests/testapp/lint-baseline.xml b/sharetarget/integration-tests/testapp/lint-baseline.xml
index 1e71b3e..e3c714d 100644
--- a/sharetarget/integration-tests/testapp/lint-baseline.xml
+++ b/sharetarget/integration-tests/testapp/lint-baseline.xml
@@ -1,24 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="SyntheticAccessor"
-        message="Access to `private` method `pushDirectShareTargets` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    pushDirectShareTargets();"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~">
+        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
             file="src/main/java/androidx/sharetarget/testapp/MainActivity.java"/>
     </issue>
 
     <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `removeAllDirectShareTargets` of class `MainActivity` requires synthetic accessor"
-        errorLine1="                    removeAllDirectShareTargets();"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        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
-            file="src/main/java/androidx/sharetarget/testapp/MainActivity.java"
-            line="61"
-            column="21"/>
+            file="src/main/java/androidx/sharetarget/testapp/OtherTextConsumerActivity.java"/>
     </issue>
 
     <issue
@@ -27,31 +25,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/androidx/sharetarget/testapp/MainActivity.java"
-            line="45"
-            column="29"/>
-    </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
-            file="src/main/java/androidx/sharetarget/testapp/OtherTextConsumerActivity.java"
-            line="30"
-            column="29"/>
-    </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
-            file="src/main/java/androidx/sharetarget/testapp/TextConsumerActivity.java"
-            line="30"
-            column="29"/>
+            file="src/main/java/androidx/sharetarget/testapp/TextConsumerActivity.java"/>
     </issue>
 
 </issues>
diff --git a/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml b/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
index 302ebde..719e8ec 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.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="MissingTestSizeAnnotation"
diff --git a/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml b/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
index a0e4a60..52581b5 100644
--- a/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
+++ b/sqlite/integration-tests/inspection-sqldelight-testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="cli" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/test/ext/junit-gtest/src/main/cpp/gtest_wrapper.cpp b/test/ext/junit-gtest/src/main/cpp/gtest_wrapper.cpp
index a992de9..0935e93 100644
--- a/test/ext/junit-gtest/src/main/cpp/gtest_wrapper.cpp
+++ b/test/ext/junit-gtest/src/main/cpp/gtest_wrapper.cpp
@@ -119,7 +119,8 @@
 
         virtual void OnTestPartResult(const testing::TestPartResult &testPartResult) override {
           if (!testPartResult.passed()) {
-            mCurrentTestError << "\n" << testPartResult.file_name() << ":" << testPartResult.line_number()
+            const char* file_name = testPartResult.file_name() != nullptr ? testPartResult.file_name() : "unknown file";
+            mCurrentTestError << "\n" << file_name << ":" << testPartResult.line_number()
                               << "\n" << testPartResult.message() << "\n";
           }
         }
diff --git a/test/integration-tests/junit-gtest-test/src/androidTest/java/androidx/test/ext/junitgtesttest/GtestRunnerTest.kt b/test/integration-tests/junit-gtest-test/src/androidTest/java/androidx/test/ext/junitgtesttest/GtestRunnerTest.kt
index ac842ad..2d694aa 100644
--- a/test/integration-tests/junit-gtest-test/src/androidTest/java/androidx/test/ext/junitgtesttest/GtestRunnerTest.kt
+++ b/test/integration-tests/junit-gtest-test/src/androidTest/java/androidx/test/ext/junitgtesttest/GtestRunnerTest.kt
@@ -47,7 +47,9 @@
     @Test
     fun runsTheTest() {
         runner.run(runNotifier)
-        assertThat(runListener.failures.single().message.normalizeWhitespace()).contains(
+        assertThat(runListener.failures).hasSize(2)
+        val adderFailure = runListener.failures[0]
+        assertThat(adderFailure.message.normalizeWhitespace()).contains(
             """
                 Expected equality of these values:
                 42
@@ -55,6 +57,14 @@
                 Which is: 43
             """.normalizeWhitespace()
         )
+
+        val uncaughtExceptionFailure = runListener.failures[1]
+        assertThat(uncaughtExceptionFailure.message.normalizeWhitespace()).contains(
+            """
+                unknown file:-1
+                Unknown C++ exception thrown in the test body.
+            """.normalizeWhitespace()
+        )
     }
 
     @Test
@@ -63,7 +73,10 @@
         assertThat(runListener.descriptions.map { it.displayName }).isEqualTo(
             listOf(
                 "adder_pass(androidx.test.ext.junitgtesttest.GtestRunnerTest\$NativeTests)",
-                "foo_fail(androidx.test.ext.junitgtesttest.GtestRunnerTest\$NativeTests)")
+                "foo_fail(androidx.test.ext.junitgtesttest.GtestRunnerTest\$NativeTests)",
+                "JUnitNotifyingListener_handles_null_file_names(androidx.test.ext.junitgtesttest." +
+                    "GtestRunnerTest\$NativeTests)"
+            )
 
         )
     }
diff --git a/test/integration-tests/junit-gtest-test/src/main/cpp/CMakeLists.txt b/test/integration-tests/junit-gtest-test/src/main/cpp/CMakeLists.txt
index 6163455..f88adb0 100644
--- a/test/integration-tests/junit-gtest-test/src/main/cpp/CMakeLists.txt
+++ b/test/integration-tests/junit-gtest-test/src/main/cpp/CMakeLists.txt
@@ -13,6 +13,7 @@
 add_library(apptest
         SHARED
         app_test.cpp
+        gtest_wrapper_test.cpp
         )
 
 target_link_libraries(apptest
diff --git a/test/integration-tests/junit-gtest-test/src/main/cpp/gtest_wrapper_test.cpp b/test/integration-tests/junit-gtest-test/src/main/cpp/gtest_wrapper_test.cpp
new file mode 100644
index 0000000..d4f7268
--- /dev/null
+++ b/test/integration-tests/junit-gtest-test/src/main/cpp/gtest_wrapper_test.cpp
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+#include "gtest/gtest.h"
+
+TEST(JUnitNotifyingListener, handles_null_file_names) {
+    throw "this should not crash the test runner";
+}
\ No newline at end of file
diff --git a/test/screenshot/screenshot/proto/build.gradle b/test/screenshot/screenshot-proto/build.gradle
similarity index 100%
rename from test/screenshot/screenshot/proto/build.gradle
rename to test/screenshot/screenshot-proto/build.gradle
diff --git a/test/screenshot/screenshot/proto/src/main/proto/screenshot_result.proto b/test/screenshot/screenshot-proto/src/main/proto/screenshot_result.proto
similarity index 100%
rename from test/screenshot/screenshot/proto/src/main/proto/screenshot_result.proto
rename to test/screenshot/screenshot-proto/src/main/proto/screenshot_result.proto
diff --git a/test/uiautomator/integration-tests/testapp/lint-baseline.xml b/test/uiautomator/integration-tests/testapp/lint-baseline.xml
deleted file mode 100644
index 61e4ed9..0000000
--- a/test/uiautomator/integration-tests/testapp/lint-baseline.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha05" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha05)" variant="all" version="7.4.0-alpha05">
-
-    <issue
-        id="DuplicateIds"
-        message="Duplicate id `@+id/shared_id`, already defined earlier in this layout"
-        errorLine1="    &lt;TextView android:id=&quot;@+id/shared_id&quot;"
-        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/res/layout/byselector_testres_activity.xml"
-            line="34"
-            column="15"/>
-        <location
-            file="src/main/res/layout/byselector_testres_activity.xml"
-            line="29"
-            column="15"
-            message="Duplicate id `@+id/shared_id` originally defined here"/>
-    </issue>
-
-</issues>
diff --git a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
index 3d8fddf..a25c616 100644
--- a/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
+++ b/test/uiautomator/integration-tests/testapp/src/androidTest/java/androidx/test/uiautomator/testapp/UiObject2Tests.java
@@ -559,47 +559,34 @@
     public void testSwipe() {
         launchTestActivity(UiObject2TestSwipeActivity.class);
 
-        // Avoid touching too close to the edges.
-        UiObject2 scrollView = mDevice.findObject(By.res(TEST_APP, "scroll_view"));
-        scrollView.setGestureMargin(SCROLL_MARGIN);
+        UiObject2 swipeRegion = mDevice.findObject(By.res(TEST_APP, "swipe_region"));
+        swipeRegion.setGestureMargin(SCROLL_MARGIN);
 
-        // Initially at top left corner.
-        assertTrue(mDevice.hasObject(By.res(TEST_APP, "top_text")));
-        assertFalse(mDevice.hasObject(By.res(TEST_APP, "right_text")));
+        swipeRegion.swipe(Direction.LEFT, 0.5f);
+        assertEquals("swipe_left", swipeRegion.getText());
 
-        // Swipe left to right bound (5000px) within one swipe.
-        scrollView.swipe(Direction.LEFT, 1.0f);
-        assertFalse(mDevice.hasObject(By.res(TEST_APP, "top_text")));
-        assertTrue(mDevice.hasObject(By.res(TEST_APP, "right_text")));
+        swipeRegion.swipe(Direction.RIGHT, 1.0f);
+        assertEquals("swipe_right", swipeRegion.getText());
 
-        // Swipe right back to left bound (0px) within one swipe.
-        scrollView.swipe(Direction.RIGHT, 1.0f);
-        assertTrue(mDevice.hasObject(By.res(TEST_APP, "top_text")));
-        assertFalse(mDevice.hasObject(By.res(TEST_APP, "right_text")));
+        swipeRegion.swipe(Direction.UP, 0.5f, 1000);
+        assertEquals("swipe_up", swipeRegion.getText());
 
-        // Swipe up to bottom bound (5000px) within one swipe.
-        scrollView.swipe(Direction.UP, 1.0f, 10000);
-        assertFalse(mDevice.hasObject(By.res(TEST_APP, "top_text")));
-        assertTrue(mDevice.hasObject(By.res(TEST_APP, "bottom_text")));
-
-        // Swipe down back to top bound (0px) within one swipe.
-        scrollView.swipe(Direction.DOWN, 1.0f, 10000);
-        assertTrue(mDevice.hasObject(By.res(TEST_APP, "top_text")));
-        assertFalse(mDevice.hasObject(By.res(TEST_APP, "bottom_text")));
+        swipeRegion.swipe(Direction.DOWN, 1.0f, 1000);
+        assertEquals("swipe_down", swipeRegion.getText());
     }
 
     @Test
     public void testSwipe_throwsIllegalArgumentException() {
         launchTestActivity(UiObject2TestSwipeActivity.class);
 
-        UiObject2 scrollView = mDevice.findObject(By.res(TEST_APP, "horizontal_scroll_view"));
+        UiObject2 swipeRegion = mDevice.findObject(By.res(TEST_APP, "swipe_region"));
 
         assertThrows("Percent must be between 0.0f and 1.0f", IllegalArgumentException.class,
-                () -> scrollView.swipe(Direction.UP, 10.0f));
+                () -> swipeRegion.swipe(Direction.UP, 10.0f));
         assertThrows("Percent must be between 0.0f and 1.0f", IllegalArgumentException.class,
-                () -> scrollView.swipe(Direction.UP, -10.0f));
+                () -> swipeRegion.swipe(Direction.UP, -10.0f));
         assertThrows("Speed cannot be negative", IllegalArgumentException.class,
-                () -> scrollView.swipe(Direction.UP, 1.0f, -10));
+                () -> swipeRegion.swipe(Direction.UP, 1.0f, -10));
     }
 
     @Test
diff --git a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestSwipeActivity.java b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestSwipeActivity.java
index 2f92cb5..ed36e65 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestSwipeActivity.java
+++ b/test/uiautomator/integration-tests/testapp/src/main/java/androidx/test/uiautomator/testapp/UiObject2TestSwipeActivity.java
@@ -18,15 +18,43 @@
 
 import android.app.Activity;
 import android.os.Bundle;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
+import android.widget.TextView;
 
 import androidx.annotation.Nullable;
 
 public class UiObject2TestSwipeActivity extends Activity {
 
+    private GestureDetector mGestureDetector;
+
     @Override
     public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         setContentView(R.layout.uiobject2_testswipe_activity);
+
+        TextView swipeRegion = findViewById(R.id.swipe_region);
+
+        mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
+            @Override
+            public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY) {
+                // Swipe is using the same logic as fling, except that their directions are
+                // opposite under the same finger movement.
+                boolean horizontal = Math.abs(vX) > Math.abs(vY);
+                if (horizontal) {
+                    swipeRegion.setText(vX < 0 ? "swipe_left" : "swipe_right");
+                } else {
+                    swipeRegion.setText(vY < 0 ? "swipe_up" : "swipe_down");
+                }
+
+                return true;
+            }
+        });
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        return mGestureDetector.onTouchEvent(event);
     }
 }
diff --git a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testswipe_activity.xml b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testswipe_activity.xml
index bf085885..9da8334 100644
--- a/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testswipe_activity.xml
+++ b/test/uiautomator/integration-tests/testapp/src/main/res/layout/uiobject2_testswipe_activity.xml
@@ -20,46 +20,11 @@
     android:orientation="vertical"
     tools:context=".UiObject2TestSwipeActivity">
 
-    <HorizontalScrollView
-        android:id="@+id/horizontal_scroll_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
-
-        <ScrollView
-            android:id="@+id/vertical_scroll_view"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
-
-            <RelativeLayout
-                android:id="@+id/scroll_view"
-                android:layout_width="5000px"
-                android:layout_height="5000px">
-
-                <TextView
-                    android:id="@+id/top_text"
-                    android:layout_width="wrap_content"
-                    android:layout_height="50px"
-                    android:layout_alignParentTop="true"
-                    android:text="This is the top" />
-
-                <TextView
-                    android:id="@+id/bottom_text"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentBottom="true"
-                    android:text="This is the bottom" />
-
-                <TextView
-                    android:id="@+id/right_text"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_alignParentRight="true"
-                    android:text="This is the right" />
-
-            </RelativeLayout>
-
-        </ScrollView>
-
-    </HorizontalScrollView>
+    <TextView
+        android:id="@+id/swipe_region"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:text="no_swipe" />
 
 </LinearLayout>
diff --git a/testutils/testutils-espresso/lint-baseline.xml b/testutils/testutils-espresso/lint-baseline.xml
index b8b87a7..e4b1fbb 100644
--- a/testutils/testutils-espresso/lint-baseline.xml
+++ b/testutils/testutils-espresso/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/testutils/testutils-fonts/src/androidMain/assets/subdirectory/asset_variable_font.ttf b/testutils/testutils-fonts/src/androidMain/assets/subdirectory/asset_variable_font.ttf
new file mode 100644
index 0000000..1fe3ee4
--- /dev/null
+++ b/testutils/testutils-fonts/src/androidMain/assets/subdirectory/asset_variable_font.ttf
Binary files differ
diff --git a/testutils/testutils-fonts/src/commonMain/resources/font/variable_font.ttf b/testutils/testutils-fonts/src/commonMain/resources/font/variable_font.ttf
new file mode 100644
index 0000000..1fe3ee4
--- /dev/null
+++ b/testutils/testutils-fonts/src/commonMain/resources/font/variable_font.ttf
Binary files differ
diff --git a/testutils/testutils-fonts/src/font_ttx/variable_font.ttx b/testutils/testutils-fonts/src/font_ttx/variable_font.ttx
new file mode 100644
index 0000000..9019c85
--- /dev/null
+++ b/testutils/testutils-fonts/src/font_ttx/variable_font.ttx
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.34">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="A"/>
+  </GlyphOrder>
+
+  <head>
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x640cdb2f"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00011011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Mon Aug  1 23:25:39 2022"/>
+    <modified value="Mon Aug  1 23:25:39 2022"/>
+    <xMin value="0"/>
+    <yMin value="-200"/>
+    <xMax value="1000"/>
+    <yMax value="800"/>
+    <macStyle value="00000000 00000000"/>
+    <lowestRecPPEM value="7"/>
+    <fontDirectionHint value="2"/>
+    <glyphDataFormat value="0"/>
+  </head>
+  
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="750"/>
+    <descent value="-250"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="2000"/>
+    <minLeftSideBearing value="0"/>
+    <minRightSideBearing value="0"/>
+    <xMaxExtent value="2000"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+  </hhea>
+
+  <maxp>
+    <tableVersion value="0x10000"/>
+    <maxZones value="0"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="0"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="3"/>
+    <xAvgCharWidth value="594"/>
+    <usWeightClass value="100"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="5"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="UKWN"/>
+    <fsSelection value="00000000 01000000"/>
+    <usFirstCharIndex value="9"/>
+    <usLastCharIndex value="122"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="0"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="0"/>
+    <mtx name="A" width="1000" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+    </cmap_format_4>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+
+    <!-- The xMin, yMin, xMax and yMax values
+         will be recalculated by the compiler. -->
+
+    <TTGlyph name=".notdef"/><!-- contains no outline data -->
+
+    <TTGlyph name="A" xMin="0" yMin="-200" xMax="2000" yMax="800">
+      <contour>
+	<pt x="0" y="-200" on="1" />
+	<pt x="500" y="800" on="1" />
+	<pt x="1000" y="-200" on="1" />
+	<pt x="500" y="700" on="1" />
+	<pt x="0" y="-200" on="1" />
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+  </glyf>
+  <name>
+    <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+      Copyright (C) 2018 The Android Open Source Project
+    </namerecord>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Variable Font
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Regular
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Variable Font
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      VariableFont-Regular
+    </namerecord>
+    <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+      Bold
+    </namerecord>
+    <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      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.
+    </namerecord>
+    <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+      http://www.apache.org/licenses/LICENSE-2.0
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="3.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-75"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+  </post>
+
+  <HVAR>
+    <Version value="0x00010000"/>
+    <VarStore Format="1">
+      <Format value="1"/>
+      <VarRegionList>
+        <!-- RegionAxisCount=1 -->
+        <!-- RegionCount=1 -->
+        <Region index="0">
+          <VarRegionAxis index="0">
+            <StartCoord value="0.0"/>
+            <PeakCoord value="1.0"/>
+            <EndCoord value="1.0"/>
+          </VarRegionAxis>
+        </Region>
+      </VarRegionList>
+      <!-- VarDataCount=2 -->
+      <VarData index="0">
+        <!-- ItemCount=1 -->
+        <NumShorts value="0"/>
+        <!-- VarRegionCount=1 -->
+        <VarRegionIndex index="0" value="0"/>
+        <Item index="0" value="[-40]"/>
+      </VarData>
+      <VarData index="1">
+        <!-- ItemCount=1 -->
+        <NumShorts value="0"/>
+        <!-- VarRegionCount=0 -->
+        <Item index="0" value="[]"/>
+      </VarData>
+    </VarStore>
+    <AdvWidthMap>
+      <Map glyph=".notdef" outer="1" inner="0"/>
+      <Map glyph="A" outer="2000" inner="2000"/>
+    </AdvWidthMap>
+  </HVAR>
+
+  <STAT>
+    <Version value="0x00010001"/>
+    <DesignAxisRecordSize value="8"/>
+    <DesignAxisRecord>
+      <Axis index="0">
+        <AxisTag value="wght"/>
+        <AxisNameID value="256"/> 
+        <AxisOrdering value="0"/>
+      </Axis>
+    </DesignAxisRecord>
+    <ElidedFallbackNameID value="0"/>
+  </STAT>
+
+
+  <fvar>
+
+    <!-- Weight -->
+    <Axis>
+      <AxisTag>wght</AxisTag>
+      <Flags>0x0</Flags>
+      <MinValue>1.0</MinValue>
+      <DefaultValue>100.0</DefaultValue>
+      <MaxValue>1000.0</MaxValue>
+      <AxisNameID>256</AxisNameID>
+    </Axis>
+
+    <NamedInstance flags="0x0" postscriptNameID="1" subfamilyNameID="7">
+      <coord axis="wght" value="1000"/>
+    </NamedInstance>
+  </fvar>
+
+  <gvar>
+    <version value="1"/>
+    <reserved value="0"/>
+    <glyphVariations glyph="A">
+      <tuple>
+        <coord axis="wght" value="1.0"/>
+        <delta pt="1" x="0" y="5"/>
+	<delta pt="2" x="0" y="0"/>
+	<delta pt="3" x="200" y="-500"/>
+	<delta pt="4" x="-1000" y="500"/>
+	<delta pt="5" x="-15" y="0"/>
+      </tuple>
+	
+    </glyphVariations>
+  </gvar>
+
+</ttFont>
diff --git a/testutils/testutils-runtime/lint-baseline.xml b/testutils/testutils-runtime/lint-baseline.xml
index cdd32fb..2d2a7d3 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.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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="BanUncheckedReflection"
diff --git a/text/text/src/androidTest/java/androidx/compose/ui/text/android/TextLayoutTest.kt b/text/text/src/androidTest/java/androidx/compose/ui/text/android/TextLayoutTest.kt
index c9b9858..2621b1e 100644
--- a/text/text/src/androidTest/java/androidx/compose/ui/text/android/TextLayoutTest.kt
+++ b/text/text/src/androidTest/java/androidx/compose/ui/text/android/TextLayoutTest.kt
@@ -429,7 +429,7 @@
                 endIndex = text.length,
                 trimFirstLineTop = false,
                 trimLastLineBottom = false,
-                topPercentage = 50
+                topRatio = 0.5f
             ), 0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
         )
 
diff --git a/text/text/src/androidTest/java/androidx/compose/ui/text/android/style/LineHeightStyleSpanTest.kt b/text/text/src/androidTest/java/androidx/compose/ui/text/android/style/LineHeightStyleSpanTest.kt
index 502b37a7..3509ecd 100644
--- a/text/text/src/androidTest/java/androidx/compose/ui/text/android/style/LineHeightStyleSpanTest.kt
+++ b/text/text/src/androidTest/java/androidx/compose/ui/text/android/style/LineHeightStyleSpanTest.kt
@@ -41,7 +41,7 @@
         val fontMetrics = FontMetricsInt(ascent = 1, descent = 1)
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -54,11 +54,11 @@
     /* single line, top percentage 0 */
 
     @Test
-    fun singleLine_topPercentage_0_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun singleLine_topRatio_0_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -69,11 +69,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_0_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun singleLine_topRatio_0_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -84,11 +84,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_0_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun singleLine_topRatio_0_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -99,11 +99,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_0_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun singleLine_topRatio_0_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -116,11 +116,11 @@
     /* single line, top percentage 100 */
 
     @Test
-    fun singleLine_topPercentage_100_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun singleLine_topRatio_100_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -131,11 +131,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_100_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun singleLine_topRatio_100_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -146,11 +146,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_100_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun singleLine_topRatio_100_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -161,11 +161,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_100_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun singleLine_topRatio_100_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -178,11 +178,11 @@
     /* single line, top percentage 50 */
 
     @Test
-    fun singleLine_topPercentage_50_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun singleLine_topRatio_50_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -194,11 +194,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_50_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun singleLine_topRatio_50_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -210,11 +210,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_50_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun singleLine_topRatio_50_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -226,11 +226,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_50_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun singleLine_topRatio_50_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -240,14 +240,14 @@
         assertThat(newFontMetrics.descent).isEqualTo(fontMetrics.descent)
     }
 
-    /* single line, proportional (topPercentage -1) */
+    /* single line, proportional (topRatio -1) */
 
     @Test
-    fun singleLine_topPercentage_proportional_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun singleLine_topRatio_proportional_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -260,11 +260,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_proportional_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun singleLine_topRatio_proportional_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -277,11 +277,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_proportional_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun singleLine_topRatio_proportional_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -293,11 +293,11 @@
     }
 
     @Test
-    fun singleLine_topPercentage_proportional_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun singleLine_topRatio_proportional_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val newFontMetrics = runSingleLine(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -310,11 +310,11 @@
     /* multi line, top percentage = 0 */
 
     @Test
-    fun multiLine_topPercentage_0_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun multiLine_topRatio_0_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -334,11 +334,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_0_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun multiLine_topRatio_0_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -358,11 +358,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_0_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun multiLine_topRatio_0_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -382,11 +382,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_0_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun multiLine_topRatio_0_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 0,
+            topRatio = 0f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -408,11 +408,11 @@
     /* multi line, top percentage = 100 */
 
     @Test
-    fun multiLine_topPercentage_100_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun multiLine_topRatio_100_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -432,11 +432,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_100_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun multiLine_topRatio_100_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -456,11 +456,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_100_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun multiLine_topRatio_100_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -480,11 +480,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_100_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun multiLine_topRatio_100_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 100,
+            topRatio = 1f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -506,11 +506,11 @@
     /* multi line, top percentage = 50 */
 
     @Test
-    fun multiLine_topPercentage_50_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun multiLine_topRatio_50_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -531,11 +531,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_50_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun multiLine_topRatio_50_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -556,11 +556,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_50_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun multiLine_topRatio_50_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -581,11 +581,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_50_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun multiLine_topRatio_50_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -605,14 +605,14 @@
         assertThat(newFontMetrics.descent).isEqualTo(fontMetrics.descent)
     }
 
-    /* multi line, proportional (topPercentage -1) */
+    /* multi line, proportional (topRatio -1) */
 
     @Test
-    fun multiLine_topPercentage_proportional_trimFirstLineTop_false_trimLastLineBottom_false() {
+    fun multiLine_topRatio_proportional_trimFirstLineTop_false_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -635,11 +635,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_proportional_trimFirstLineTop_false_trimLastLineBottom_true() {
+    fun multiLine_topRatio_proportional_trimFirstLineTop_false_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = false,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -662,11 +662,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_proportional_trimFirstLineTop_true_trimLastLineBottom_false() {
+    fun multiLine_topRatio_proportional_trimFirstLineTop_true_trimLastLineBottom_false() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = true,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -689,11 +689,11 @@
     }
 
     @Test
-    fun multiLine_topPercentage_proportional_trimFirstLineTop_true_trimLastLineBottom_true() {
+    fun multiLine_topRatio_proportional_trimFirstLineTop_true_trimLastLineBottom_true() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = -1,
+            topRatio = -1f,
             trimFirstLineTop = true,
             trimLastLineBottom = true,
             fontMetrics = fontMetrics
@@ -718,11 +718,11 @@
     /* first ascent & last descent diff */
 
     @Test
-    fun singleLine_with_firstLineTop_and_lastLineBottom_topPercentage_50_larger_line_height() {
+    fun singleLine_with_firstLineTop_and_lastLineBottom_topRatio_50_larger_line_height() {
         val fontMetrics = createFontMetrics()
 
         val span = createSingleLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             newLineHeight = fontMetrics.doubleLineHeight()
@@ -736,11 +736,11 @@
     }
 
     @Test
-    fun multiLine_with_firstLineTop_and_lastLineBottom_topPercentage_50_larger_line_height() {
+    fun multiLine_with_firstLineTop_and_lastLineBottom_topRatio_50_larger_line_height() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             fontMetrics = fontMetrics
@@ -756,11 +756,11 @@
     }
 
     @Test
-    fun singleLine_with_firstLineTop_and_lastLineBottom_topPercentage_50_smaller_line_height() {
+    fun singleLine_with_firstLineTop_and_lastLineBottom_topRatio_50_smaller_line_height() {
         val fontMetrics = createFontMetrics()
 
         val span = createSingleLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             newLineHeight = fontMetrics.lineHeight() / 2
@@ -774,11 +774,11 @@
     }
 
     @Test
-    fun multiLine_with_firstLineTop_and_lastLineBottom_topPercentage_50_smaller_line_height() {
+    fun multiLine_with_firstLineTop_and_lastLineBottom_topRatio_50_smaller_line_height() {
         val fontMetrics = createFontMetrics()
 
         val span = createMultiLineSpan(
-            topPercentage = 50,
+            topRatio = 0.5f,
             trimFirstLineTop = false,
             trimLastLineBottom = false,
             newLineHeight = fontMetrics.lineHeight() / 2
@@ -804,13 +804,13 @@
      * the updated font metrics.
      */
     private fun runSingleLine(
-        topPercentage: Int,
+        topRatio: Float,
         trimFirstLineTop: Boolean,
         trimLastLineBottom: Boolean,
         fontMetrics: FontMetricsInt
     ): FontMetricsInt {
         val span = createSingleLineSpan(
-            topPercentage = topPercentage,
+            topRatio = topRatio,
             trimFirstLineTop = trimFirstLineTop,
             trimLastLineBottom = trimLastLineBottom,
             newLineHeight = fontMetrics.doubleLineHeight()
@@ -823,7 +823,7 @@
      * Creates a LineHeightSpan that covers [SingleLineStartIndex, SingleLineEndIndex].
      */
     private fun createSingleLineSpan(
-        topPercentage: Int,
+        topRatio: Float,
         trimFirstLineTop: Boolean,
         trimLastLineBottom: Boolean,
         newLineHeight: Int
@@ -833,19 +833,19 @@
         endIndex = SingleLineEndIndex,
         trimFirstLineTop = trimFirstLineTop,
         trimLastLineBottom = trimLastLineBottom,
-        topPercentage = topPercentage
+        topRatio = topRatio
     )
 
     /**
      * Creates a LineHeightSpan that covers [MultiLineStartIndex, MultiLineEndIndex].
      */
     private fun createMultiLineSpan(
-        topPercentage: Int,
+        topRatio: Float,
         trimFirstLineTop: Boolean,
         trimLastLineBottom: Boolean,
         fontMetrics: FontMetricsInt
     ): LineHeightStyleSpan = createMultiLineSpan(
-        topPercentage = topPercentage,
+        topRatio = topRatio,
         trimFirstLineTop = trimFirstLineTop,
         trimLastLineBottom = trimLastLineBottom,
         newLineHeight = fontMetrics.doubleLineHeight()
@@ -855,7 +855,7 @@
      * Creates a LineHeightSpan that covers [MultiLineStartIndex, MultiLineEndIndex].
      */
     private fun createMultiLineSpan(
-        topPercentage: Int,
+        topRatio: Float,
         trimFirstLineTop: Boolean,
         trimLastLineBottom: Boolean,
         newLineHeight: Int
@@ -865,7 +865,7 @@
         endIndex = MultiLineEndIndex,
         trimFirstLineTop = trimFirstLineTop,
         trimLastLineBottom = trimLastLineBottom,
-        topPercentage = topPercentage
+        topRatio = topRatio
     )
 
     /**
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
index b5ee0da..a6298b6 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/TextLayout.kt
@@ -16,10 +16,12 @@
 package androidx.compose.ui.text.android
 
 import android.graphics.Canvas
+import android.graphics.Paint.FontMetricsInt
 import android.graphics.Path
 import android.graphics.RectF
 import android.text.BoringLayout
 import android.text.Layout
+import android.text.SpannableString
 import android.text.Spanned
 import android.text.StaticLayout
 import android.text.TextDirectionHeuristic
@@ -134,6 +136,10 @@
     @VisibleForTesting
     val layout: Layout
 
+    /**
+     * Resolved line count. If maxLines smaller than the real number of lines in the text, this
+     * property will return the minimum between the two
+     */
     val lineCount: Int
 
     /**
@@ -154,8 +160,26 @@
     @VisibleForTesting
     internal val bottomPadding: Int
 
+    /**
+     * When true the wrapped layout that was created is a BoringLayout.
+     */
     private val isBoringLayout: Boolean
 
+    /**
+     * When the last line of the text is empty, ParagraphStyle's are not applied. This becomes
+     * visible during edit operations when the text field is empty or user inputs an new line
+     * character. This layout contains the text layout that would be applied if the last line
+     * was not empty.
+     */
+    private val lastLineFontMetrics: FontMetricsInt?
+
+    /**
+     * Holds the difference in line height for the lastLineFontMetrics and the wrapped text layout.
+     */
+    private val lastLineExtra: Int
+
+    val lineHeightSpans: Array<LineHeightStyleSpan>
+
     init {
         val end = charSequence.length
         val frameworkTextDir = getTextDirectionHeuristic(textDirectionHeuristic)
@@ -251,9 +275,15 @@
             }
 
         val verticalPaddings = getVerticalPaddings()
-        val lineHeightPaddings = getLineHeightPaddings()
+
+        lineHeightSpans = getLineHeightSpans()
+        val lineHeightPaddings = getLineHeightPaddings(lineHeightSpans)
         topPadding = max(verticalPaddings.first, lineHeightPaddings.first)
         bottomPadding = max(verticalPaddings.second, lineHeightPaddings.second)
+
+        val lastLineMetricsPair = getLastLineMetrics(textPaint, frameworkTextDir, lineHeightSpans)
+        lastLineFontMetrics = lastLineMetricsPair.first
+        lastLineExtra = lastLineMetricsPair.second
     }
 
     private val layoutHelper by lazy(LazyThreadSafetyMode.NONE) { LayoutHelper(layout) }
@@ -266,18 +296,32 @@
             layout.getLineBottom(lineCount - 1)
         } else {
             layout.height
-        } + topPadding + bottomPadding
+        } + topPadding + bottomPadding + lastLineExtra
 
     fun getLineLeft(lineIndex: Int): Float = layout.getLineLeft(lineIndex)
 
+    /**
+     * Return the horizontal leftmost position of the line in pixels.
+     */
     fun getLineRight(lineIndex: Int): Float = layout.getLineRight(lineIndex)
 
+    /**
+     * Return the vertical position of the top of the line in pixels. If the line is equal to the
+     * line count, returns the bottom of the last line.
+     */
     fun getLineTop(line: Int): Float {
         val top = layout.getLineTop(line).toFloat()
         return top + if (line == 0) 0 else topPadding
     }
 
+    /**
+     * Return the vertical position of the bottom of the line in pixels.
+     */
     fun getLineBottom(line: Int): Float {
+        if (line == lineCount - 1 && lastLineFontMetrics != null) {
+            return layout.getLineBottom(line - 1).toFloat() + lastLineFontMetrics.bottom
+        }
+
         return topPadding +
             layout.getLineBottom(line).toFloat() +
             if (line == lineCount - 1) bottomPadding else 0
@@ -289,9 +333,24 @@
      *
      * @param line the line index starting from 0
      */
-    fun getLineAscent(line: Int): Float = layout.getLineAscent(line).toFloat()
+    fun getLineAscent(line: Int): Float {
+        return if (line == lineCount - 1 && lastLineFontMetrics != null) {
+            lastLineFontMetrics.ascent.toFloat()
+        } else {
+            layout.getLineAscent(line).toFloat()
+        }
+    }
 
-    fun getLineBaseline(line: Int): Float = topPadding + layout.getLineBaseline(line).toFloat()
+    /**
+     * Return the vertical position of the baseline of the line in pixels.
+     */
+    fun getLineBaseline(line: Int): Float {
+        return topPadding + if (line == lineCount - 1 && lastLineFontMetrics != null) {
+            getLineTop(line) - lastLineFontMetrics.ascent
+        } else {
+            layout.getLineBaseline(line).toFloat()
+        }
+    }
 
     /**
      * Returns the descent of the line in the line coordinates. Baseline is considered to be 0,
@@ -299,14 +358,31 @@
      *
      * @param line the line index starting from 0
      */
-    fun getLineDescent(line: Int): Float = layout.getLineDescent(line).toFloat()
+    fun getLineDescent(line: Int): Float {
+        return if (line == lineCount - 1 && lastLineFontMetrics != null) {
+            lastLineFontMetrics.descent.toFloat()
+        } else {
+            layout.getLineDescent(line).toFloat()
+        }
+    }
 
     fun getLineHeight(lineIndex: Int): Float = getLineBottom(lineIndex) - getLineTop(lineIndex)
 
+    /**
+     * Return the width of the line in pixels.
+     */
     fun getLineWidth(lineIndex: Int): Float = layout.getLineWidth(lineIndex)
 
+    /**
+     * Return the text offset at the beginning of the line. If the line is equal to the line count,
+     * returns the length of the text.
+     */
     fun getLineStart(lineIndex: Int): Int = layout.getLineStart(lineIndex)
 
+    /**
+     * Return the text offset at the end of the line. If the line is equal to the line count,
+     * returns the length of the text.
+     */
     fun getLineEnd(lineIndex: Int): Int =
         if (layout.getEllipsisStart(lineIndex) == 0) { // no ellipsis
             layout.getLineEnd(lineIndex)
@@ -317,6 +393,10 @@
             layout.text.length
         }
 
+    /**
+     * Return the text offset after the last visible character on the specified line. For example
+     * whitespaces are not counted as visible characters.
+     */
     fun getLineVisibleEnd(lineIndex: Int): Int =
         if (layout.getEllipsisStart(lineIndex) == 0) { // no ellipsis
             layout.getLineVisibleEnd(lineIndex)
@@ -683,10 +763,10 @@
         // reuse the existing rect since there is single line
         firstLineTextBounds
     } else {
-        val line = layout.lineCount - 1
+        val line = lineCount - 1
         paint.getCharSequenceBounds(text, layout.getLineStart(line), layout.getLineEnd(line))
     }
-    val descent = layout.getLineDescent(layout.lineCount - 1)
+    val descent = layout.getLineDescent(lineCount - 1)
 
     // when textBounds.bottom is "lower" than descent, we need to add the difference into account
     // since includeFontPadding is false, descent is at the bottom of Layout
@@ -706,10 +786,11 @@
 private val EmptyPair = Pair(0, 0)
 
 @OptIn(InternalPlatformTextApi::class)
-private fun TextLayout.getLineHeightPaddings(): Pair<Int, Int> {
+private fun TextLayout.getLineHeightPaddings(
+    lineHeightSpans: Array<LineHeightStyleSpan>
+): Pair<Int, Int> {
     var firstAscentDiff = 0
     var lastDescentDiff = 0
-    val lineHeightSpans = getLineHeightSpans()
 
     for (span in lineHeightSpans) {
         if (span.firstAscentDiff < 0) {
@@ -728,6 +809,60 @@
 }
 
 @OptIn(InternalPlatformTextApi::class)
+private fun TextLayout.getLastLineMetrics(
+    textPaint: TextPaint,
+    frameworkTextDir: TextDirectionHeuristic,
+    lineHeightSpans: Array<LineHeightStyleSpan>
+): Pair<FontMetricsInt?, Int> {
+    val lastLine = lineCount - 1
+    // did not check for "\n" since the last line might include zero width characters
+    if (layout.getLineStart(lastLine) == layout.getLineEnd(lastLine) &&
+        lineHeightSpans.isNotEmpty()
+    ) {
+        val emptyText = SpannableString("\u200B")
+        val lineHeightSpan = lineHeightSpans.first()
+        val newLineHeightSpan = lineHeightSpan.copy(
+            startIndex = 0,
+            endIndex = emptyText.length,
+            trimFirstLineTop = if (lastLine != 0 && lineHeightSpan.trimLastLineBottom) {
+                false
+            } else {
+                lineHeightSpan.trimLastLineBottom
+            }
+        )
+
+        emptyText.setSpan(
+            newLineHeightSpan,
+            0,
+            emptyText.length,
+            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+        )
+
+        val tmpLayout = StaticLayoutFactory.create(
+            text = emptyText,
+            start = 0,
+            end = emptyText.length,
+            width = Int.MAX_VALUE,
+            paint = textPaint,
+            textDir = frameworkTextDir,
+            includePadding = includePadding,
+            useFallbackLineSpacing = fallbackLineSpacing
+        )
+
+        val lastLineFontMetrics = FontMetricsInt().apply {
+            ascent = tmpLayout.getLineAscent(0)
+            descent = tmpLayout.getLineDescent(0)
+            top = tmpLayout.getLineTop(0)
+            bottom = tmpLayout.getLineBottom(0)
+        }
+
+        val lastLineExtra = lastLineFontMetrics.bottom - getLineHeight(lastLine).toInt()
+        return Pair(lastLineFontMetrics, lastLineExtra)
+    }
+    return Pair(null, 0)
+}
+
+@OptIn(InternalPlatformTextApi::class)
 private fun TextLayout.getLineHeightSpans(): Array<LineHeightStyleSpan> {
     if (text !is Spanned) return emptyArray()
     val lineHeightStyleSpans = (text as Spanned).getSpans(
diff --git a/text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightStyleSpan.kt b/text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightStyleSpan.kt
index 24e2065..d0a755a 100644
--- a/text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightStyleSpan.kt
+++ b/text/text/src/main/java/androidx/compose/ui/text/android/style/LineHeightStyleSpan.kt
@@ -16,7 +16,7 @@
 package androidx.compose.ui.text.android.style
 
 import android.graphics.Paint.FontMetricsInt
-import androidx.annotation.IntRange
+import androidx.annotation.FloatRange
 import androidx.compose.ui.text.android.InternalPlatformTextApi
 import kotlin.math.abs
 import kotlin.math.ceil
@@ -37,7 +37,7 @@
  * as a result of the line height is not added.  Single line text is both the first and last line.
  * @param lineHeight The specified line height in pixel units, which is the space between the
  * baseline of adjacent lines.
- * @param topPercentage The percentage on how to distribute the line height for a given line.
+ * @param topRatio The percentage on how to distribute the line height for a given line.
  * 0 means all space as a result of line height is applied to the bottom. Similarly, 100 means
  * all space as a result of line height is applied to the top.
  *
@@ -49,8 +49,8 @@
     private val startIndex: Int,
     private val endIndex: Int,
     private val trimFirstLineTop: Boolean,
-    private val trimLastLineBottom: Boolean,
-    @IntRange(from = 0, to = 100) private val topPercentage: Int
+    val trimLastLineBottom: Boolean,
+    @FloatRange(from = 0.0, to = 1.0) private val topRatio: Float
 ) : android.text.style.LineHeightSpan {
 
     private var firstAscent: Int = 0
@@ -67,8 +67,8 @@
         private set
 
     init {
-        check(topPercentage in 0..100 || topPercentage == -1) {
-            "topRatio should be in [0..100] range or -1"
+        check(topRatio in 0f..1f || topRatio == -1f) {
+            "topRatio should be in [0..1] range or -1"
         }
     }
 
@@ -103,18 +103,18 @@
         // calculate the difference between the current line lineHeight and the requested lineHeight
         val diff = ceiledLineHeight - currentHeight
 
-        val ascentRatio = if (topPercentage == -1) {
-            (abs(fontMetricsInt.ascent.toFloat()) / fontMetricsInt.lineHeight() * 100f).toInt()
+        val ascentRatio = if (topRatio == -1f) {
+            abs(fontMetricsInt.ascent.toFloat()) / fontMetricsInt.lineHeight()
         } else {
-            topPercentage
+            topRatio
         }
 
         val descentDiff = if (diff <= 0) {
-            // diff * topPercentage is the amount that should go to below the baseline
-            ceil(diff * ascentRatio / 100f).toInt()
+            // diff * topRatio is the amount that should go to below the baseline
+            ceil(diff * ascentRatio).toInt()
         } else {
-            // diff * (100 - topPercentage) is the amount that should go to below the baseline
-            ceil(diff * (100 - ascentRatio) / 100f).toInt()
+            // diff * (1f - topRatio) is the amount that should go to below the baseline
+            ceil(diff * (1f - ascentRatio)).toInt()
         }
 
         descent = fontMetricsInt.descent + descentDiff
@@ -125,6 +125,19 @@
         firstAscentDiff = fontMetricsInt.ascent - firstAscent
         lastDescentDiff = lastDescent - fontMetricsInt.descent
     }
+
+    internal fun copy(
+        startIndex: Int,
+        endIndex: Int,
+        trimFirstLineTop: Boolean = this.trimFirstLineTop
+    ) = LineHeightStyleSpan(
+        lineHeight = lineHeight,
+        startIndex = startIndex,
+        endIndex = endIndex,
+        trimFirstLineTop = trimFirstLineTop,
+        trimLastLineBottom = trimLastLineBottom,
+        topRatio = topRatio
+    )
 }
 
 internal fun FontMetricsInt.lineHeight(): Int = this.descent - this.ascent
\ No newline at end of file
diff --git a/vectordrawable/integration-tests/testapp/lint-baseline.xml b/vectordrawable/integration-tests/testapp/lint-baseline.xml
index 6c79993..7ed06df 100644
--- a/vectordrawable/integration-tests/testapp/lint-baseline.xml
+++ b/vectordrawable/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -142,9 +142,7 @@
         errorLine1="                m-.001, 0"
         errorLine2="            ~~~~">
         <location
-            file="src/main/res/drawable/vector_drawable04.xml"
-            line="27"
-            column="13"/>
+            file="src/main/res/drawable/vector_drawable04.xml"/>
     </issue>
 
     <issue
@@ -153,9 +151,7 @@
         errorLine1="                m-.001, 0"
         errorLine2="                       ^">
         <location
-            file="src/main/res/drawable/vector_drawable04.xml"
-            line="27"
-            column="24"/>
+            file="src/main/res/drawable/vector_drawable04.xml"/>
     </issue>
 
     <issue
@@ -164,9 +160,7 @@
         errorLine1="                a .001,.001 0 1,0 .002,0"
         errorLine2="                                     ^">
         <location
-            file="src/main/res/drawable/vector_drawable04.xml"
-            line="28"
-            column="38"/>
+            file="src/main/res/drawable/vector_drawable04.xml"/>
     </issue>
 
     <issue
@@ -175,9 +169,7 @@
         errorLine1="                a .001,.001 0 1,0 .002,0"
         errorLine2="                      ~~~~">
         <location
-            file="src/main/res/drawable/vector_drawable04.xml"
-            line="28"
-            column="23"/>
+            file="src/main/res/drawable/vector_drawable04.xml"/>
     </issue>
 
     <issue
@@ -186,9 +178,7 @@
         errorLine1="                a .001,.001 0 1,0 .002,0"
         errorLine2="                           ~~~~">
         <location
-            file="src/main/res/drawable/vector_drawable04.xml"
-            line="28"
-            column="28"/>
+            file="src/main/res/drawable/vector_drawable04.xml"/>
     </issue>
 
     <issue
@@ -197,9 +187,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                                    ~~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="53"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -208,9 +196,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                  ~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="35"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -219,9 +205,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                      ~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="39"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -230,9 +214,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                        ~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="41"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -241,9 +223,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                                ~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="49"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -252,9 +232,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                                  ~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="51"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -263,9 +241,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                    ~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="37"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -274,9 +250,7 @@
         errorLine1="            android:pathData=&quot;l0.0.0.5.0.0.5-0.5.0.0-.5z&quot;"
         errorLine2="                                          ~~">
         <location
-            file="src/main/res/drawable/vector_drawable29.xml"
-            line="25"
-            column="43"/>
+            file="src/main/res/drawable/vector_drawable29.xml"/>
     </issue>
 
     <issue
@@ -285,9 +259,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java"
-            line="39"
-            column="29"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/AVDCListenerDemo.java"/>
     </issue>
 
     <issue
@@ -296,9 +268,7 @@
         errorLine1="    protected int[] mIcons = {"
         errorLine2="              ~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java"
-            line="38"
-            column="15"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java"/>
     </issue>
 
     <issue
@@ -307,9 +277,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java"
-            line="51"
-            column="29"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleAnimatedVectorDrawable.java"/>
     </issue>
 
     <issue
@@ -318,9 +286,7 @@
         errorLine1="    protected int[] mIcons = {"
         errorLine2="              ~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java"
-            line="39"
-            column="15"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java"/>
     </issue>
 
     <issue
@@ -329,9 +295,7 @@
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java"
-            line="85"
-            column="29"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SimpleStaticVectorDrawable.java"/>
     </issue>
 
     <issue
@@ -340,9 +304,7 @@
         errorLine1="    public void onCreate(Bundle savedInstanceState) {"
         errorLine2="                         ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="42"
-            column="26"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -351,9 +313,7 @@
         errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
         errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="59"
-            column="15"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -362,9 +322,7 @@
         errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
         errorLine2="                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="59"
-            column="49"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -373,9 +331,7 @@
         errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
         errorLine2="              ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="128"
-            column="15"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -384,9 +340,7 @@
         errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
         errorLine2="                                    ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="128"
-            column="37"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -395,9 +349,7 @@
         errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
         errorLine2="                                                ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="128"
-            column="49"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -406,9 +358,7 @@
         errorLine1="    protected Intent browseIntent(String path) {"
         errorLine2="              ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="134"
-            column="15"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -417,9 +367,7 @@
         errorLine1="    protected Intent browseIntent(String path) {"
         errorLine2="                                  ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="134"
-            column="35"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -428,9 +376,7 @@
         errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="141"
-            column="28"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -439,9 +385,7 @@
         errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
         errorLine2="                                                           ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="141"
-            column="60"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
     <issue
@@ -450,9 +394,7 @@
         errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
         errorLine2="                                                                        ~~~~~~">
         <location
-            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"
-            line="141"
-            column="73"/>
+            file="src/main/java/com/example/android/support/vectordrawable/app/SupportVectorDrawableDemos.java"/>
     </issue>
 
 </issues>
diff --git a/vectordrawable/vectordrawable-animated/lint-baseline.xml b/vectordrawable/vectordrawable-animated/lint-baseline.xml
index 84bb277..29ba9cd 100644
--- a/vectordrawable/vectordrawable-animated/lint-baseline.xml
+++ b/vectordrawable/vectordrawable-animated/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/vectordrawable/vectordrawable/lint-baseline.xml b/vectordrawable/vectordrawable/lint-baseline.xml
index f647f1f..a918dbd 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="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/viewpager/viewpager/lint-baseline.xml b/viewpager/viewpager/lint-baseline.xml
index a252977..c9974a1 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="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/viewpager2/integration-tests/testapp/lint-baseline.xml b/viewpager2/integration-tests/testapp/lint-baseline.xml
index c43cebf..2120164 100644
--- a/viewpager2/integration-tests/testapp/lint-baseline.xml
+++ b/viewpager2/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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/wear/compose/compose-material/api/current.txt b/wear/compose/compose-material/api/current.txt
index 24edf96..d60f59f 100644
--- a/wear/compose/compose-material/api/current.txt
+++ b/wear/compose/compose-material/api/current.txt
@@ -5,12 +5,17 @@
     ctor public AutoCenteringParams(optional int itemIndex, optional int itemOffset);
   }
 
+  @androidx.compose.runtime.Stable public interface ButtonBorder {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled);
+  }
+
   @androidx.compose.runtime.Stable public interface ButtonColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
   }
 
   public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonBorder buttonBorder(optional androidx.compose.foundation.BorderStroke? borderStroke, optional androidx.compose.foundation.BorderStroke? disabledBorderStroke);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
     method public float getCompactButtonBackgroundPadding();
     method public float getDefaultButtonSize();
@@ -21,6 +26,8 @@
     method public float getSmallButtonSize();
     method public float getSmallIconSize();
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors iconButtonColors(optional long contentColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonBorder outlinedButtonBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors outlinedButtonColors(optional long contentColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors primaryButtonColors(optional long backgroundColor, optional long contentColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors secondaryButtonColors(optional long backgroundColor, optional long contentColor);
     property public final float CompactButtonBackgroundPadding;
@@ -35,10 +42,12 @@
   }
 
   public final class ButtonKt {
-    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
   }
 
   public final class CardDefaults {
@@ -57,6 +66,10 @@
     method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long contentColor, optional long titleColor, optional long timeColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
+  @androidx.compose.runtime.Stable public interface ChipBorder {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled);
+  }
+
   @androidx.compose.runtime.Stable public interface ChipColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.painter.Painter> background(boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
@@ -66,6 +79,7 @@
 
   public final class ChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors childChipColors(optional long contentColor, optional long secondaryContentColor, optional long iconColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipBorder chipBorder(optional androidx.compose.foundation.BorderStroke? borderStroke, optional androidx.compose.foundation.BorderStroke? disabledBorderStroke);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors chipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor, optional long disabledBackgroundColor, optional long disabledContentColor, optional long disabledSecondaryContentColor, optional long disabledIconColor);
     method public androidx.compose.foundation.layout.PaddingValues getCompactChipContentPadding();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
@@ -74,6 +88,8 @@
     method public float getSmallIconSize();
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors gradientBackgroundChipColors(optional long startBackgroundColor, optional long endBackgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor, optional androidx.compose.ui.unit.LayoutDirection gradientDirection);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors imageBackgroundChipColors(androidx.compose.ui.graphics.painter.Painter backgroundImagePainter, optional androidx.compose.ui.graphics.Brush backgroundImageScrimBrush, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipBorder outlinedChipBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors outlinedChipColors(optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors primaryChipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors secondaryChipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     property public final androidx.compose.foundation.layout.PaddingValues CompactChipContentPadding;
@@ -85,11 +101,14 @@
   }
 
   public final class ChipKt {
-    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, androidx.wear.compose.material.ChipBorder border, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit> label, kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
-    method @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
     method @Deprecated @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
+    method @androidx.compose.runtime.Composable public static void OutlinedChip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
+    method @androidx.compose.runtime.Composable public static void OutlinedCompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
   }
 
   @androidx.compose.runtime.Stable public final class Colors {
diff --git a/wear/compose/compose-material/api/public_plus_experimental_current.txt b/wear/compose/compose-material/api/public_plus_experimental_current.txt
index 998bb35..773d83e 100644
--- a/wear/compose/compose-material/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-material/api/public_plus_experimental_current.txt
@@ -5,12 +5,17 @@
     ctor public AutoCenteringParams(optional int itemIndex, optional int itemOffset);
   }
 
+  @androidx.compose.runtime.Stable public interface ButtonBorder {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled);
+  }
+
   @androidx.compose.runtime.Stable public interface ButtonColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
   }
 
   public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonBorder buttonBorder(optional androidx.compose.foundation.BorderStroke? borderStroke, optional androidx.compose.foundation.BorderStroke? disabledBorderStroke);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
     method public float getCompactButtonBackgroundPadding();
     method public float getDefaultButtonSize();
@@ -21,6 +26,8 @@
     method public float getSmallButtonSize();
     method public float getSmallIconSize();
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors iconButtonColors(optional long contentColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonBorder outlinedButtonBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors outlinedButtonColors(optional long contentColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors primaryButtonColors(optional long backgroundColor, optional long contentColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors secondaryButtonColors(optional long backgroundColor, optional long contentColor);
     property public final float CompactButtonBackgroundPadding;
@@ -35,10 +42,12 @@
   }
 
   public final class ButtonKt {
-    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
   }
 
   public final class CardDefaults {
@@ -57,6 +66,10 @@
     method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long contentColor, optional long titleColor, optional long timeColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
+  @androidx.compose.runtime.Stable public interface ChipBorder {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled);
+  }
+
   @androidx.compose.runtime.Stable public interface ChipColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.painter.Painter> background(boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
@@ -66,6 +79,7 @@
 
   public final class ChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors childChipColors(optional long contentColor, optional long secondaryContentColor, optional long iconColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipBorder chipBorder(optional androidx.compose.foundation.BorderStroke? borderStroke, optional androidx.compose.foundation.BorderStroke? disabledBorderStroke);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors chipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor, optional long disabledBackgroundColor, optional long disabledContentColor, optional long disabledSecondaryContentColor, optional long disabledIconColor);
     method public androidx.compose.foundation.layout.PaddingValues getCompactChipContentPadding();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
@@ -74,6 +88,8 @@
     method public float getSmallIconSize();
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors gradientBackgroundChipColors(optional long startBackgroundColor, optional long endBackgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor, optional androidx.compose.ui.unit.LayoutDirection gradientDirection);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors imageBackgroundChipColors(androidx.compose.ui.graphics.painter.Painter backgroundImagePainter, optional androidx.compose.ui.graphics.Brush backgroundImageScrimBrush, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipBorder outlinedChipBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors outlinedChipColors(optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors primaryChipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors secondaryChipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     property public final androidx.compose.foundation.layout.PaddingValues CompactChipContentPadding;
@@ -85,11 +101,14 @@
   }
 
   public final class ChipKt {
-    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, androidx.wear.compose.material.ChipBorder border, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit> label, kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
-    method @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
     method @Deprecated @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
+    method @androidx.compose.runtime.Composable public static void OutlinedChip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
+    method @androidx.compose.runtime.Composable public static void OutlinedCompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
   }
 
   @androidx.compose.runtime.Stable public final class Colors {
diff --git a/wear/compose/compose-material/api/restricted_current.ignore b/wear/compose/compose-material/api/restricted_current.ignore
new file mode 100644
index 0000000..6a5066c
--- /dev/null
+++ b/wear/compose/compose-material/api/restricted_current.ignore
@@ -0,0 +1,5 @@
+// Baseline format: 1.0
+InvalidNullConversion: androidx.wear.compose.material.ButtonDefaults#buttonColors(long, long, long, long):
+    Attempted to remove @NonNull annotation from method androidx.wear.compose.material.ButtonDefaults.buttonColors(long,long,long,long)
+InvalidNullConversion: androidx.wear.compose.material.ChipDefaults#chipColors(long, long, long, long, long, long, long, long):
+    Attempted to remove @NonNull annotation from method androidx.wear.compose.material.ChipDefaults.chipColors(long,long,long,long,long,long,long,long)
diff --git a/wear/compose/compose-material/api/restricted_current.txt b/wear/compose/compose-material/api/restricted_current.txt
index 24edf96..d60f59f 100644
--- a/wear/compose/compose-material/api/restricted_current.txt
+++ b/wear/compose/compose-material/api/restricted_current.txt
@@ -5,12 +5,17 @@
     ctor public AutoCenteringParams(optional int itemIndex, optional int itemOffset);
   }
 
+  @androidx.compose.runtime.Stable public interface ButtonBorder {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled);
+  }
+
   @androidx.compose.runtime.Stable public interface ButtonColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> backgroundColor(boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
   }
 
   public final class ButtonDefaults {
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonBorder buttonBorder(optional androidx.compose.foundation.BorderStroke? borderStroke, optional androidx.compose.foundation.BorderStroke? disabledBorderStroke);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors buttonColors(optional long backgroundColor, optional long contentColor, optional long disabledBackgroundColor, optional long disabledContentColor);
     method public float getCompactButtonBackgroundPadding();
     method public float getDefaultButtonSize();
@@ -21,6 +26,8 @@
     method public float getSmallButtonSize();
     method public float getSmallIconSize();
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors iconButtonColors(optional long contentColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonBorder outlinedButtonBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors outlinedButtonColors(optional long contentColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors primaryButtonColors(optional long backgroundColor, optional long contentColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ButtonColors secondaryButtonColors(optional long backgroundColor, optional long contentColor);
     property public final float CompactButtonBackgroundPadding;
@@ -35,10 +42,12 @@
   }
 
   public final class ButtonKt {
-    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void Button(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void CompactButton(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void OutlinedCompactButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.wear.compose.material.ButtonColors colors, optional float backgroundPadding, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ButtonBorder border, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit> content);
   }
 
   public final class CardDefaults {
@@ -57,6 +66,10 @@
     method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long contentColor, optional long titleColor, optional long timeColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
   }
 
+  @androidx.compose.runtime.Stable public interface ChipBorder {
+    method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.foundation.BorderStroke> borderStroke(boolean enabled);
+  }
+
   @androidx.compose.runtime.Stable public interface ChipColors {
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.painter.Painter> background(boolean enabled);
     method @androidx.compose.runtime.Composable public androidx.compose.runtime.State<androidx.compose.ui.graphics.Color> contentColor(boolean enabled);
@@ -66,6 +79,7 @@
 
   public final class ChipDefaults {
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors childChipColors(optional long contentColor, optional long secondaryContentColor, optional long iconColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipBorder chipBorder(optional androidx.compose.foundation.BorderStroke? borderStroke, optional androidx.compose.foundation.BorderStroke? disabledBorderStroke);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors chipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor, optional long disabledBackgroundColor, optional long disabledContentColor, optional long disabledSecondaryContentColor, optional long disabledIconColor);
     method public androidx.compose.foundation.layout.PaddingValues getCompactChipContentPadding();
     method public androidx.compose.foundation.layout.PaddingValues getContentPadding();
@@ -74,6 +88,8 @@
     method public float getSmallIconSize();
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors gradientBackgroundChipColors(optional long startBackgroundColor, optional long endBackgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor, optional androidx.compose.ui.unit.LayoutDirection gradientDirection);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors imageBackgroundChipColors(androidx.compose.ui.graphics.painter.Painter backgroundImagePainter, optional androidx.compose.ui.graphics.Brush backgroundImageScrimBrush, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipBorder outlinedChipBorder(optional long borderColor, optional long disabledBorderColor, optional float borderWidth);
+    method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors outlinedChipColors(optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors primaryChipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     method @androidx.compose.runtime.Composable public androidx.wear.compose.material.ChipColors secondaryChipColors(optional long backgroundColor, optional long contentColor, optional long secondaryContentColor, optional long iconColor);
     property public final androidx.compose.foundation.layout.PaddingValues CompactChipContentPadding;
@@ -85,11 +101,14 @@
   }
 
   public final class ChipKt {
-    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
-    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, androidx.wear.compose.material.ChipBorder border, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
+    method @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
+    method @Deprecated @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, androidx.wear.compose.material.ChipColors colors, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit> content);
     method @Deprecated @androidx.compose.runtime.Composable public static void Chip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit> label, kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
-    method @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape);
+    method @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
     method @Deprecated @androidx.compose.runtime.Composable public static void CompactChip(kotlin.jvm.functions.Function0<? extends kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,? extends kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,? extends kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding);
+    method @androidx.compose.runtime.Composable public static void OutlinedChip(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> label, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? secondaryLabel, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
+    method @androidx.compose.runtime.Composable public static void OutlinedCompactChip(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit>? label, optional kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.BoxScope,kotlin.Unit>? icon, optional androidx.wear.compose.material.ChipColors colors, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.wear.compose.material.ChipBorder border);
   }
 
   @androidx.compose.runtime.Stable public final class Colors {
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ButtonSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ButtonSample.kt
index 45999be..84d77cc 100644
--- a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ButtonSample.kt
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ButtonSample.kt
@@ -27,6 +27,8 @@
 import androidx.wear.compose.material.ButtonDefaults
 import androidx.wear.compose.material.CompactButton
 import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.OutlinedButton
+import androidx.wear.compose.material.OutlinedCompactButton
 import androidx.wear.compose.material.Text
 
 @Sampled
@@ -47,6 +49,22 @@
 
 @Sampled
 @Composable
+fun OutlinedButtonWithIcon() {
+    OutlinedButton(
+        onClick = { /* Do something */ },
+        enabled = true,
+    ) {
+        Icon(
+            painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+            contentDescription = "airplane",
+            modifier = Modifier
+                .size(ButtonDefaults.DefaultIconSize).wrapContentSize(align = Alignment.Center),
+        )
+    }
+}
+
+@Sampled
+@Composable
 fun LargeButtonWithIcon() {
     Button(
         onClick = { /* Do something */ },
@@ -89,3 +107,19 @@
         )
     }
 }
+
+@Sampled
+@Composable
+fun OutlinedCompactButtonWithIcon() {
+    OutlinedCompactButton(
+        onClick = { /* Do something */ },
+        enabled = true,
+    ) {
+        Icon(
+            painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+            contentDescription = "airplane",
+            modifier = Modifier
+                .size(ButtonDefaults.SmallIconSize).wrapContentSize(align = Alignment.Center),
+        )
+    }
+}
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ChipSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ChipSample.kt
index 290ce62..d89dbd0 100644
--- a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ChipSample.kt
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ChipSample.kt
@@ -30,6 +30,8 @@
 import androidx.wear.compose.material.ChipDefaults
 import androidx.wear.compose.material.CompactChip
 import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.OutlinedChip
+import androidx.wear.compose.material.OutlinedCompactChip
 import androidx.wear.compose.material.Text
 
 @Sampled
@@ -58,6 +60,30 @@
 
 @Sampled
 @Composable
+fun OutlinedChipWithIconAndLabel() {
+    OutlinedChip(
+        onClick = { /* Do something */ },
+        enabled = true,
+        // When we have only primary label we can have up to 2 lines of text
+        label = {
+            Text(
+                text = "Main label can span over 2 lines",
+                maxLines = 2, overflow = TextOverflow.Ellipsis
+            )
+        },
+        icon = {
+            Icon(
+                painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+                contentDescription = "airplane",
+                modifier = Modifier.size(ChipDefaults.IconSize)
+                    .wrapContentSize(align = Alignment.Center),
+            )
+        }
+    )
+}
+
+@Sampled
+@Composable
 fun ChipWithIconAndLabels() {
     Chip(
         onClick = { /* Do something */ },
@@ -132,3 +158,23 @@
         },
     )
 }
+
+@Sampled
+@Composable
+fun OutlinedCompactChipWithIconAndLabel() {
+    OutlinedCompactChip(
+        onClick = { /* Do something */ },
+        enabled = true,
+        // CompactChip label should be no more than 1 line of text
+        label = {
+            Text("Single line label", maxLines = 1, overflow = TextOverflow.Ellipsis)
+        },
+        icon = {
+            Icon(
+                painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+                contentDescription = "airplane",
+                modifier = Modifier.size(ChipDefaults.SmallIconSize),
+            )
+        },
+    )
+}
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonScreenshotTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonScreenshotTest.kt
index 37b49c2..7e13a9d 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonScreenshotTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonScreenshotTest.kt
@@ -66,6 +66,28 @@
         }
 
     @Test
+    fun button_outlined_ltr() =
+        verifyScreenshot(LayoutDirection.Ltr) {
+            OutlinedButton(
+                onClick = {},
+                modifier = Modifier.testTag(TEST_TAG),
+            ) {
+                Text("abc")
+            }
+        }
+
+    @Test
+    fun button_outlined_rtl() =
+        verifyScreenshot(LayoutDirection.Rtl) {
+            OutlinedButton(
+                onClick = {},
+                modifier = Modifier.testTag(TEST_TAG),
+            ) {
+                Text("abc")
+            }
+        }
+
+    @Test
     fun button_disabled() =
         verifyScreenshot {
             Button(onClick = {}, enabled = false, modifier = Modifier.testTag(TEST_TAG)) {
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt
index 5fe12c5..b537b76 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ButtonTest.kt
@@ -612,6 +612,14 @@
         )
 
     @Test
+    public fun gives_enabled_button_outlined_colors() =
+        verifyOutlinedButtonColors(
+            Status.Enabled,
+            { ButtonDefaults.outlinedButtonColors() },
+            { Color.Transparent },
+            { MaterialTheme.colors.primary },
+        )
+    @Test
     public fun gives_enabled_compact_button_icon_colors() =
         verifyCompactButtonColors(
             Status.Enabled,
@@ -630,6 +638,14 @@
         )
 
     @Test
+    public fun gives_disabled_button_outlined_colors() =
+        verifyOutlinedButtonColors(
+            Status.Disabled,
+            { ButtonDefaults.outlinedButtonColors() },
+            { Color.Transparent },
+            { MaterialTheme.colors.primary },
+        )
+    @Test
     public fun gives_disabled_compact_button_icon_colors() =
         verifyCompactButtonColors(
             Status.Disabled,
@@ -818,6 +834,30 @@
         }
     }
 
+    public fun verifyOutlinedButtonColors(
+        status: Status,
+        buttonColors: @Composable () -> ButtonColors,
+        backgroundColor: @Composable () -> Color,
+        contentColor: @Composable () -> Color,
+    ) {
+        verifyColors(
+            status,
+            backgroundColor,
+            contentColor,
+        ) {
+            var actualColor = Color.Transparent
+            OutlinedButton(
+                onClick = {},
+                colors = buttonColors(),
+                enabled = status.enabled(),
+                modifier = Modifier.testTag(TEST_TAG)
+            ) {
+                actualColor = LocalContentColor.current
+            }
+            return@verifyColors actualColor
+        }
+    }
+
     public fun verifyCompactButtonColors(
         status: Status,
         buttonColors: @Composable () -> ButtonColors,
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipScreenshotTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipScreenshotTest.kt
index a8731b4..f41c847 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipScreenshotTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipScreenshotTest.kt
@@ -35,6 +35,7 @@
 import androidx.wear.compose.material.ChipColors
 import androidx.wear.compose.material.ChipDefaults
 import androidx.wear.compose.material.CompactChip
+import androidx.wear.compose.material.OutlinedChip
 import androidx.wear.compose.material.SCREENSHOT_GOLDEN_PATH
 import androidx.wear.compose.material.TEST_TAG
 import androidx.wear.compose.material.TestIcon
@@ -70,6 +71,26 @@
     }
 
     @Test
+    fun chip_secondary_ltr() = verifyScreenshot(layoutDirection = LayoutDirection.Ltr) {
+        sampleChip(colors = ChipDefaults.secondaryChipColors())
+    }
+
+    @Test
+    fun chip_secondary_rtl() = verifyScreenshot(layoutDirection = LayoutDirection.Rtl) {
+        sampleChip(colors = ChipDefaults.secondaryChipColors())
+    }
+
+    @Test
+    fun chip_outlined_ltr() = verifyScreenshot(layoutDirection = LayoutDirection.Ltr) {
+        sampleOutlinedChip()
+    }
+
+    @Test
+    fun chip_outlined_rtl() = verifyScreenshot(layoutDirection = LayoutDirection.Rtl) {
+        sampleOutlinedChip()
+    }
+
+    @Test
     fun chip_disabled() = verifyScreenshot(layoutDirection = LayoutDirection.Ltr) {
         sampleChip(enabled = false)
     }
@@ -122,6 +143,22 @@
     }
 
     @Composable
+    private fun sampleOutlinedChip(
+        enabled: Boolean = true,
+        colors: ChipColors = ChipDefaults.outlinedChipColors()
+    ) {
+        OutlinedChip(
+            enabled = enabled,
+            colors = colors,
+            onClick = {},
+            label = { Text("Standard chip") },
+            secondaryLabel = { Text("Secondary text") },
+            icon = { TestIcon() },
+            modifier = Modifier.testTag(TEST_TAG),
+        )
+    }
+
+    @Composable
     private fun sampleCompactChip(enabled: Boolean = true) {
         CompactChip(
             enabled = enabled,
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt
index 761fe35..977466b 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt
@@ -74,7 +74,8 @@
       Chip(
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -90,7 +91,8 @@
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
         enabled = true,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -106,7 +108,8 @@
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
         enabled = false,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -122,7 +125,8 @@
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
         enabled = true,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -138,7 +142,8 @@
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
         enabled = false,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -156,7 +161,8 @@
         onClick = { clicked = true },
         colors = ChipDefaults.primaryChipColors(),
         enabled = true,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -178,7 +184,8 @@
         onClick = { clicked = true },
         colors = ChipDefaults.primaryChipColors(),
         enabled = false,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -198,7 +205,8 @@
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
         enabled = false,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -218,6 +226,7 @@
     rule.isStadiumShape(LayoutDirection.Ltr) {
       Chip(
         modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder(),
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
       ) { /* omit content to allow us to validate the shape by pixel checking */ }
@@ -228,6 +237,7 @@
     rule.isStadiumShape(LayoutDirection.Rtl) {
       Chip(
         modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder(),
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
       ) { /* omit content to allow us to validate the shape by pixel checking */ }
@@ -380,6 +390,7 @@
       Chip(
         onClick = {},
         colors = ChipDefaults.primaryChipColors(),
+        border = ChipDefaults.chipBorder()
       ) {
         TestImage()
       }
@@ -387,6 +398,7 @@
   }
 }
 
+@Suppress("DEPRECATION")
 class ChipColorTest {
   @get:Rule
   val rule = createComposeRule()
@@ -489,6 +501,15 @@
     )
 
   @Test
+  fun gives_outlined_enabled_colors() =
+    verifyColors(
+      TestChipColors.Outlined,
+      ChipStatus.Enabled,
+      { Color.Transparent },
+      { MaterialTheme.colors.primary }
+    )
+
+  @Test
   fun gives_image_background_enabled_colors() =
     verifyContentColors(
       TestChipColors.ImageBackground,
@@ -526,6 +547,16 @@
     )
 
   @Test
+  fun gives_outlined_disabled_colors() =
+    verifyColors(
+      TestChipColors.Outlined,
+      ChipStatus.Disabled,
+      { Color.Transparent },
+      { MaterialTheme.colors.primary },
+      { Color.Transparent }
+    )
+
+  @Test
   fun gives_image_background_disabled_colors() =
     verifyContentColors(
       TestChipColors.ImageBackground,
@@ -566,7 +597,8 @@
           content = {},
           colors = ChipDefaults.primaryChipColors(backgroundColor = overrideColor),
           enabled = true,
-          modifier = Modifier.testTag("test-item")
+          modifier = Modifier.testTag("test-item"),
+          border = ChipDefaults.chipBorder()
         )
       }
     }
@@ -587,7 +619,8 @@
           content = {},
           colors = ChipDefaults.chipColors(disabledBackgroundColor = overrideColor),
           enabled = false,
-          modifier = Modifier.testTag("test-item")
+          modifier = Modifier.testTag("test-item"),
+          border = ChipDefaults.chipBorder()
         )
       }
     }
@@ -611,7 +644,8 @@
           actualContentColor = LocalContentColor.current
         },
         enabled = true,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       )
     }
 
@@ -686,7 +720,8 @@
           actualContentColor = LocalContentColor.current
         },
         enabled = false,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       )
     }
 
@@ -718,7 +753,8 @@
           colors = testChipColors.chipColors(),
           content = { actualContent = LocalContentColor.current },
           enabled = status.enabled(),
-          modifier = Modifier.testTag("test-item")
+          modifier = Modifier.testTag("test-item"),
+          border = ChipDefaults.chipBorder()
         )
       }
     }
@@ -757,13 +793,25 @@
           .fillMaxSize()
           .background(testBackground)
       ) {
-        Chip(
-          onClick = {},
-          colors = testChipColors.chipColors(),
-          content = { actualContent = LocalContentColor.current },
-          enabled = status.enabled(),
-          modifier = Modifier.testTag("test-item")
-        )
+        if (testChipColors == TestChipColors.Outlined) {
+          OutlinedChip(
+            onClick = {},
+            colors = testChipColors.chipColors(),
+            label = { actualContent = LocalContentColor.current },
+            enabled = status.enabled(),
+            modifier = Modifier.testTag("test-item"),
+            border = ChipDefaults.chipBorder()
+          )
+        } else {
+          Chip(
+            onClick = {},
+            colors = testChipColors.chipColors(),
+            content = { actualContent = LocalContentColor.current },
+            enabled = status.enabled(),
+            modifier = Modifier.testTag("test-item"),
+            border = ChipDefaults.chipBorder()
+          )
+        }
       }
     }
 
@@ -933,7 +981,8 @@
           actualTextStyle = LocalTextStyle.current
         },
         enabled = true,
-        modifier = Modifier.testTag("test-item")
+        modifier = Modifier.testTag("test-item"),
+        border = ChipDefaults.chipBorder()
       )
     }
     assertEquals(expectedTextStyle, actualTextStyle)
@@ -1038,10 +1087,11 @@
     rule.setContentWithTheme {
       background = MaterialTheme.colors.surface
       chipColor = MaterialTheme.colors.primary
-      content(Modifier
-                .testTag("test-item")
-                .padding(padding)
-                .background(background))
+      content(
+        Modifier
+          .testTag("test-item")
+          .padding(padding)
+          .background(background))
     }
 
     rule.onNodeWithTag("test-item")
@@ -1132,6 +1182,12 @@
       return ChipDefaults.childChipColors()
     }
   },
+  Outlined {
+    @Composable
+    override fun chipColors(): ChipColors {
+      return ChipDefaults.outlinedChipColors()
+    }
+  },
   ImageBackground {
     @Composable
     override fun chipColors(): ChipColors {
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt
index 6d6b1df..4045de9 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt
@@ -15,7 +15,9 @@
  */
 package androidx.wear.compose.material
 
+import androidx.compose.foundation.BorderStroke
 import androidx.compose.foundation.background
+import androidx.compose.foundation.border
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -93,7 +95,17 @@
     colors: ButtonColors = ButtonDefaults.primaryButtonColors(),
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     content: @Composable BoxScope.() -> Unit,
-) = Button(onClick, modifier, enabled, colors, interactionSource, CircleShape, content)
+) =
+    Button(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        colors = colors,
+        interactionSource = interactionSource,
+        shape = CircleShape,
+        border = ButtonDefaults.buttonBorder(),
+        content = content
+    )
 
 /**
  * Wear Material [Button] that offers a single slot to take any content (text, icon or image).
@@ -136,6 +148,8 @@
  * appearance / behavior of this Button in different [Interaction]s.
  * @param shape Defines the button's shape. It is strongly recommended to use the default as this
  * shape is a key characteristic of the Wear Material Theme.
+ * @param border [ButtonBorder] that will be used to resolve the button border in different states.
+ * See [ButtonDefaults.buttonBorder].
  */
 @Composable
 public fun Button(
@@ -145,8 +159,10 @@
     colors: ButtonColors = ButtonDefaults.primaryButtonColors(),
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     shape: Shape = CircleShape,
+    border: ButtonBorder = ButtonDefaults.buttonBorder(),
     content: @Composable BoxScope.() -> Unit,
 ) {
+    val borderStroke = border.borderStroke(enabled = enabled).value
     Box(
         contentAlignment = Alignment.Center,
         modifier = modifier
@@ -154,6 +170,10 @@
                 minWidth = ButtonDefaults.DefaultButtonSize,
                 minHeight = ButtonDefaults.DefaultButtonSize
             )
+            .then(
+                if (borderStroke != null) Modifier.border(border = borderStroke, shape = shape)
+                else Modifier
+            )
             .clip(shape)
             .clickable(
                 onClick = onClick,
@@ -179,6 +199,55 @@
 }
 
 /**
+ * Wear Material [OutlinedButton] that offers a single slot to take any content (text, icon or
+ * image).
+ *
+ * The recommended [Button] sizes can be obtained
+ * from [ButtonDefaults] - see [ButtonDefaults.DefaultButtonSize], [ButtonDefaults.LargeButtonSize],
+ * [ButtonDefaults.SmallButtonSize].
+ * Icon content should be of size [ButtonDefaults.DefaultIconSize],
+ * [ButtonDefaults.LargeIconSize] or [ButtonDefaults.SmallIconSize] respectively.
+ *
+ * [Button]s can be enabled or disabled. A disabled button will not respond to click events.
+ *
+ * An [OutlinedButton] has a transparent background and a thin border by default with
+ * content taking the theme primary color.
+ *
+ * Example of a [OutlinedButton] displaying an icon:
+ * @sample androidx.wear.compose.material.samples.OutlinedButtonWithIcon
+ *
+ * For more information, see the
+ * [Buttons](https://developer.android.com/training/wearables/components/buttons)
+ * guide.
+ *
+ * @param onClick Will be called when the user clicks the button.
+ * @param modifier Modifier to be applied to the button.
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not
+ * be clickable.
+ * @param colors [ButtonColors] that will be used to resolve the background and content color for
+ * this button in different states. See [ButtonDefaults.outlinedButtonColors].
+ * @param interactionSource The [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Button. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this Button in different [Interaction]s.
+ * @param shape Defines the button's shape. It is strongly recommended to use the default as this
+ * shape is a key characteristic of the Wear Material Theme.
+ * @param border [ButtonBorder] that will be used to resolve the button border in different states.
+ * See [ButtonDefaults.outlinedButtonBorder].
+ */
+@Composable
+public fun OutlinedButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    colors: ButtonColors = ButtonDefaults.outlinedButtonColors(),
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    shape: Shape = CircleShape,
+    border: ButtonBorder = ButtonDefaults.outlinedButtonBorder(),
+    content: @Composable BoxScope.() -> Unit,
+) = Button(onClick, modifier, enabled, colors, interactionSource, shape, border, content)
+
+/**
  * Wear Material [CompactButton] that offers a single slot to take any content
  * (text, icon or image).
  *
@@ -234,6 +303,7 @@
     backgroundPadding,
     interactionSource,
     CircleShape,
+    ButtonDefaults.buttonBorder(),
     content)
 
 /**
@@ -283,8 +353,10 @@
     backgroundPadding: Dp = ButtonDefaults.CompactButtonBackgroundPadding,
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     shape: Shape = CircleShape,
+    border: ButtonBorder = ButtonDefaults.buttonBorder(),
     content: @Composable BoxScope.() -> Unit,
 ) {
+    val borderStroke = border.borderStroke(enabled).value
     Box(
         contentAlignment = Alignment.Center,
         modifier = modifier
@@ -298,6 +370,12 @@
             )
             .padding(backgroundPadding)
             .requiredSize(ButtonDefaults.ExtraSmallButtonSize)
+            .then(
+                if (borderStroke != null) Modifier.border(
+                    border = borderStroke,
+                    shape = shape
+                ) else Modifier
+            )
             .background(
                 color = colors.backgroundColor(enabled = enabled).value,
                 shape = shape
@@ -315,6 +393,68 @@
 }
 
 /**
+ * Wear Material [OutlinedCompactButton] that offers a single slot to take any content
+ * (text, icon or image).
+ *
+ * The [OutlinedCompactButton] has background size [ButtonDefaults.ExtraSmallButtonSize].
+ * There is an transparent padding around the background, defaulted to
+ * [ButtonDefaults.CompactButtonBackgroundPadding], which increases the clickable area. Icon content
+ * should have size [ButtonDefaults.SmallIconSize].
+ *
+ * An [OutlinedCompactButton] has a transparent background and a thin border by default with
+ * content taking the theme primary color.
+ *
+ * [OutlinedCompactButton]s can be enabled or disabled. A disabled button will not respond to click
+ * events.
+ *
+ * Example usage:
+ * @sample androidx.wear.compose.material.samples.OutlinedCompactButtonWithIcon
+ *
+ * For more information, see the
+ * [Buttons](https://developer.android.com/training/wearables/components/buttons)
+ * guide.
+ *
+ * @param onClick Will be called when the user clicks the button.
+ * @param modifier Modifier to be applied to the button.
+ * @param enabled Controls the enabled state of the button. When `false`, this button will not
+ * be clickable.
+ * @param colors [ButtonColors] that will be used to resolve the background and content color for
+ * this button in different states. See [ButtonDefaults.outlinedButtonColors].
+ * @param backgroundPadding Increases the transparent clickable area around the background,
+ * defaults to [ButtonDefaults.CompactButtonBackgroundPadding]
+ * @param interactionSource The [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Button. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this Button in different [Interaction]s.
+ * @param shape Defines the button's shape. It is strongly recommended to use the default as this
+ * shape is a key characteristic of the Wear Material Theme.
+ * @param border [ButtonBorder] that will be used to resolve the button border in different states.
+ * See [ButtonDefaults.outlinedButtonBorder].
+ */
+@Composable
+public fun OutlinedCompactButton(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    colors: ButtonColors = ButtonDefaults.outlinedButtonColors(),
+    backgroundPadding: Dp = ButtonDefaults.CompactButtonBackgroundPadding,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    shape: Shape = CircleShape,
+    border: ButtonBorder = ButtonDefaults.outlinedButtonBorder(),
+    content: @Composable BoxScope.() -> Unit,
+) =
+    CompactButton(
+        onClick = onClick,
+        modifier = modifier,
+        enabled = enabled,
+        colors = colors,
+        backgroundPadding = backgroundPadding,
+        interactionSource = interactionSource,
+        shape = shape,
+        border = border,
+        content = content
+    )
+/**
  * Represents the background and content colors used in a button in different states.
  *
  * See [ButtonDefaults.primaryButtonColors] for the default colors used in
@@ -342,13 +482,27 @@
 }
 
 /**
+ * Represents the border stroke used in a [Button] in different states.
+ */
+@Stable
+public interface ButtonBorder {
+    @Composable
+    /**
+     * Represents the border stroke for this border, depending on [enabled] or null if no border
+     *
+     * @param enabled Whether the button is enabled
+     */
+    public fun borderStroke(enabled: Boolean): State<BorderStroke?>
+}
+
+/**
  * Contains the default values used by [Button].
  */
 public object ButtonDefaults {
     /**
      * Creates a [ButtonColors] that represents the default background and content colors for a
      * primary [Button]. Primary buttons have a colored background with a contrasting content color.
-     * If a button is disabled then the color will have an alpha ([ContentAlpha.disabled]) value
+     * If a button is disabled then the colors will have an alpha ([ContentAlpha.disabled]) value
      * applied.
      *
      * @param backgroundColor The background color of this [Button] when enabled
@@ -368,7 +522,7 @@
     /**
      * Creates a [ButtonColors] that represents the default background and content colors for a
      * secondary [Button]. Secondary buttons have a muted background with a contrasting content
-     * color. If a button is disabled then the color will have an alpha ([ContentAlpha.disabled])
+     * color. If a button is disabled then the colors will have an alpha ([ContentAlpha.disabled])
      * value applied.
      *
      * @param backgroundColor The background color of this [Button] when enabled
@@ -387,7 +541,7 @@
 
     /**
      * Creates a [ButtonColors] that represents the content colors for
-     * an icon-only [Button]. If a button is disabled then the color will have an alpha
+     * an icon-only [Button]. If a button is disabled then the colors will have an alpha
      * ([ContentAlpha.disabled]) value applied.
      *
      * @param contentColor The content color of this [Button] when enabled
@@ -403,6 +557,60 @@
     }
 
     /**
+     * Creates a [ButtonColors] that represents the content colors for
+     * an [OutlinedButton]. If a button is disabled then the colors will have an alpha
+     * ([ContentAlpha.disabled]) value applied.
+     *
+     * @param contentColor The content color of this [OutlinedButton] when enabled
+     */
+    @Composable
+    public fun outlinedButtonColors(
+        contentColor: Color = MaterialTheme.colors.primary,
+    ): ButtonColors {
+        return buttonColors(
+            backgroundColor = Color.Transparent,
+            contentColor = contentColor
+        )
+    }
+
+    /**
+     * Creates a [ButtonBorder] for the default border used in most [Button]
+     *
+     * @param borderStroke The border of this [Button] when enabled - or no border if null
+     * @param disabledBorderStroke The border of this [Button] when disabled - or no border if null
+     */
+    @Composable
+    public fun buttonBorder(
+        borderStroke: BorderStroke? = null,
+        disabledBorderStroke: BorderStroke? = borderStroke
+    ): ButtonBorder {
+        return DefaultButtonBorder(
+            borderStroke = borderStroke,
+            disabledBorderStroke = disabledBorderStroke
+        )
+    }
+
+    /**
+     * Creates a [ButtonBorder] for the [OutlinedButton]
+     *
+     * @param borderColor The color to use for the border for this [OutlinedButton] when enabled
+     * @param disabledBorderColor The color to use for the border for this [OutlinedButton] when
+     * disabled
+     * @param borderWidth The width to use for the border for this [OutlinedButton]
+     */
+    @Composable
+    public fun outlinedButtonBorder(
+        borderColor: Color = MaterialTheme.colors.primaryVariant.copy(alpha = 0.6f),
+        disabledBorderColor: Color = borderColor.copy(alpha = ContentAlpha.disabled),
+        borderWidth: Dp = 2.dp
+    ): ButtonBorder {
+        return DefaultButtonBorder(
+            borderStroke = BorderStroke(borderWidth, borderColor),
+            disabledBorderStroke = BorderStroke(borderWidth, disabledBorderColor)
+        )
+    }
+
+    /**
      * The default background size of a [CompactButton].
      */
     public val ExtraSmallButtonSize = 32.dp
@@ -460,12 +668,12 @@
         backgroundColor: Color = MaterialTheme.colors.primary,
         contentColor: Color = contentColorFor(backgroundColor),
         disabledBackgroundColor: Color = backgroundColor.copy(alpha = ContentAlpha.disabled),
-        disabledContentColor: Color = contentColor.copy(alpha = ContentAlpha.disabled),
+        disabledContentColor: Color = contentColor.copy(alpha = ContentAlpha.disabled)
     ): ButtonColors = DefaultButtonColors(
         backgroundColor = backgroundColor,
         contentColor = contentColor,
         disabledBackgroundColor = disabledBackgroundColor,
-        disabledContentColor = disabledContentColor,
+        disabledContentColor = disabledContentColor
     )
 }
 
@@ -477,7 +685,7 @@
     private val backgroundColor: Color,
     private val contentColor: Color,
     private val disabledBackgroundColor: Color,
-    private val disabledContentColor: Color,
+    private val disabledContentColor: Color
 ) : ButtonColors {
     @Composable
     override fun backgroundColor(enabled: Boolean): State<Color> {
@@ -516,3 +724,36 @@
         return result
     }
 }
+
+/**
+ * Default [ButtonBorder] implementation.
+ */
+@Immutable
+private class DefaultButtonBorder(
+    private val borderStroke: BorderStroke? = null,
+    private val disabledBorderStroke: BorderStroke? = null
+) : ButtonBorder {
+    @Composable
+    override fun borderStroke(enabled: Boolean): State<BorderStroke?> {
+        return rememberUpdatedState(if (enabled) borderStroke else disabledBorderStroke)
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null) return false
+        if (this::class != other::class) return false
+
+        other as DefaultButtonBorder
+
+        if (borderStroke != other.borderStroke) return false
+        if (disabledBorderStroke != other.disabledBorderStroke) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = borderStroke.hashCode()
+        result = 31 * result + disabledBorderStroke.hashCode()
+        return result
+    }
+}
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
index ac66e672..0b5f4ba 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
@@ -15,6 +15,8 @@
  */
 package androidx.wear.compose.material
 
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.border
 import androidx.compose.foundation.clickable
 import androidx.compose.foundation.interaction.Interaction
 import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -99,6 +101,9 @@
  * @param role The type of user interface element. Accessibility services might use this
  * to describe the element or do customizations
  */
+@Deprecated("This overload is provided for backwards compatibility with Compose for Wear OS 1.0." +
+    "A newer overload is available with an additional border parameter.",
+    level = DeprecationLevel.HIDDEN)
 @Composable
 public fun Chip(
     onClick: () -> Unit,
@@ -110,15 +115,89 @@
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     role: Role? = Role.Button,
     content: @Composable RowScope.() -> Unit,
+) = Chip(
+    onClick = onClick,
+    colors = colors,
+    border = ChipDefaults.chipBorder(),
+    modifier = modifier,
+    enabled = enabled,
+    contentPadding = contentPadding,
+    shape = shape,
+    interactionSource = interactionSource,
+    role = role,
+    content = content)
+
+/**
+ * Base level Wear Material [Chip] that offers a single slot to take any content.
+ *
+ * Is used as the container for more opinionated [Chip] components that take specific content such
+ * as icons and labels.
+ *
+ * The [Chip] is Stadium shaped and has a max height designed to take no more than two lines of text
+ * of [Typography.button] style. The [Chip] can have an icon or image horizontally
+ * parallel to the two lines of text.
+ *
+ * The [Chip] can have different styles with configurable content colors, background colors
+ * including gradients, these are provided by [ChipColors] implementations.
+ *
+ * The recommended set of [ChipColors] styles can be obtained from [ChipDefaults], e.g.
+ * [ChipDefaults.primaryChipColors] to get a color scheme for a primary [Chip] which by default
+ * will have a solid background of [Colors.primary] and content color of
+ * [Colors.onPrimary].
+ *
+ * Chips can be enabled or disabled. A disabled chip will not respond to click events.
+ *
+ * For more information, see the
+ * [Chips](https://developer.android.com/training/wearables/components/chips)
+ * guide.
+ *
+ * @param onClick Will be called when the user clicks the chip
+ * @param colors [ChipColors] that will be used to resolve the background and content color for
+ * this chip in different states. See [ChipDefaults.chipColors].
+ * @param border [ChipBorder] that will be used to resolve the border for this chip in different
+ * states. See [ChipDefaults.chipBorder].
+ * @param modifier Modifier to be applied to the chip
+ * @param enabled Controls the enabled state of the chip. When `false`, this chip will not
+ * be clickable
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content
+ * @param shape Defines the chip's shape. It is strongly recommended to use the default as this
+ * shape is a key characteristic of the Wear Material Theme
+ * @param interactionSource The [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Chip. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this Chip in different [Interaction]s.
+ * @param role The type of user interface element. Accessibility services might use this
+ * to describe the element or do customizations
+ */
+@Composable
+public fun Chip(
+    onClick: () -> Unit,
+    colors: ChipColors,
+    border: ChipBorder,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    contentPadding: PaddingValues = ChipDefaults.ContentPadding,
+    shape: Shape = MaterialTheme.shapes.small,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    role: Role? = Role.Button,
+    content: @Composable RowScope.() -> Unit,
 ) {
     CompositionLocalProvider(
         LocalContentColor provides colors.contentColor(enabled = enabled).value,
         LocalTextStyle provides MaterialTheme.typography.button,
         LocalContentAlpha provides colors.contentColor(enabled = enabled).value.alpha,
     ) {
+        val borderStroke = border.borderStroke(enabled).value
         Row(
             modifier = modifier
                 .height(ChipDefaults.Height)
+                .then(
+                    if (borderStroke != null) Modifier.border(
+                        border = borderStroke,
+                        shape = shape
+                    ) else Modifier
+                )
                 .clip(shape = shape)
                 .width(intrinsicSize = IntrinsicSize.Max)
                 .paint(
@@ -219,7 +298,7 @@
     interactionSource,
     contentPadding,
     MaterialTheme.shapes.small
-    )
+)
 
 /**
  * Wear Material [Chip] that offers three slots and a specific layout for an icon, label and
@@ -277,6 +356,8 @@
  * content
  * @param shape Defines the chip's shape. It is strongly recommended to use the default as this
  * shape is a key characteristic of the Wear Material Theme
+ * @param border [ChipBorder] that will be used to resolve the chip border in different states.
+ * See [ChipDefaults.chipBorder].
  */
 @Composable
 public fun Chip(
@@ -290,10 +371,12 @@
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     contentPadding: PaddingValues = ChipDefaults.ContentPadding,
     shape: Shape = MaterialTheme.shapes.small,
+    border: ChipBorder = ChipDefaults.chipBorder()
     ) {
     Chip(
         onClick = onClick,
         colors = colors,
+        border = border,
         modifier = modifier,
         enabled = enabled,
         interactionSource = interactionSource,
@@ -348,6 +431,84 @@
 }
 
 /**
+ * Wear Material [OutlinedChip] that offers three slots and a specific layout for an icon, label and
+ * secondaryLabel. The icon and secondaryLabel are optional. The items are laid out with the icon,
+ * if provided, at the start of a row, with a column next containing the two label slots.
+ *
+ * The [OutlinedChip] is Stadium shaped and has a max height designed to take no more than two lines
+ * of text of [Typography.button] style. If no secondary label is provided then the label
+ * can be two lines of text. The label and secondary label should be consistently aligned.
+ *
+ * If a icon is provided then the labels should be "start" aligned, e.g. left aligned in ltr so that
+ * the text starts next to the icon.
+ *
+ * the [OutlinedChip] has a transparent background, a thin border and contents which are
+ * colored with the theme primary color. Colors can be obtained and customized using
+ * [ChipDefaults.outlinedChipColors()].
+ *
+ * Chips can be enabled or disabled. A disabled chip will not respond to click events.
+ *
+ * Example of a [OutlinedChip] with icon and a label only with longer text:
+ * @sample androidx.wear.compose.material.samples.OutlinedChipWithIconAndLabel
+ *
+ * For more information, see the
+ * [Chips](https://developer.android.com/training/wearables/components/chips)
+ * guide.
+ *
+ * @param label A slot for providing the chip's main label. The contents are expected to be text
+ * which is "start" aligned if there is an icon preset and "start" or "center" aligned if not.
+ * @param onClick Will be called when the user clicks the chip
+ * @param modifier Modifier to be applied to the chip
+ * @param secondaryLabel A slot for providing the chip's secondary label. The contents are expected
+ * to be text which is "start" aligned if there is an icon preset and "start" or "center" aligned if
+ * not. label and secondaryLabel contents should be consistently aligned.
+ * @param icon A slot for providing the chip's icon. The contents are expected to be a horizontally
+ * and vertically aligned icon of size [ChipDefaults.IconSize] or [ChipDefaults.LargeIconSize]. In
+ * order to correctly render when the Chip is not enabled the icon must set its alpha value to
+ * [LocalContentAlpha].
+ * @param colors [ChipColors] that will be used to resolve the background and content color for
+ * this chip in different states.
+ * @param enabled Controls the enabled state of the chip. When `false`, this chip will not
+ * be clickable
+ * @param interactionSource The [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Chip. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this Chip in different [Interaction]s.
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content
+ * @param shape Defines the chip's shape. It is strongly recommended to use the default as this
+ * shape is a key characteristic of the Wear Material Theme
+ * @param border [ChipBorder] that will be used to resolve the chip border in different states.
+ */
+@Composable
+public fun OutlinedChip(
+    label: @Composable RowScope.() -> Unit,
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    secondaryLabel: (@Composable RowScope.() -> Unit)? = null,
+    icon: (@Composable BoxScope.() -> Unit)? = null,
+    colors: ChipColors = ChipDefaults.outlinedChipColors(),
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    contentPadding: PaddingValues = ChipDefaults.ContentPadding,
+    shape: Shape = MaterialTheme.shapes.small,
+    border: ChipBorder = ChipDefaults.outlinedChipBorder()
+) =
+    Chip(
+        label = label,
+        onClick = onClick,
+        modifier = modifier,
+        secondaryLabel = secondaryLabel,
+        icon = icon,
+        colors = colors,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        contentPadding = contentPadding,
+        shape = shape,
+        border = border
+    )
+
+/**
  * A compact Wear Material Chip that offers two slots and a specific layout for an icon and label.
  * Both the icon and label are optional however it is expected that at least one will be provided.
  *
@@ -430,16 +591,17 @@
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     contentPadding: PaddingValues = ChipDefaults.CompactChipContentPadding,
 ) = CompactChip(
-        onClick,
-        modifier,
-        label,
-        icon,
-        colors,
-        enabled,
-        interactionSource,
-        contentPadding,
-        MaterialTheme.shapes.small
-    )
+    onClick,
+    modifier,
+    label,
+    icon,
+    colors,
+    enabled,
+    interactionSource,
+    contentPadding,
+    MaterialTheme.shapes.small,
+    ChipDefaults.chipBorder()
+)
 
 /**
  * A compact Wear Material Chip that offers two slots and a specific layout for an icon and label.
@@ -511,6 +673,8 @@
  * content
  * @param shape Defines the chip's shape. It is strongly recommended to use the default as this
  * shape is a key characteristic of the Wear Material Theme
+ * @param border [ChipBorder] that will be used to resolve the border for this chip in different
+ * states. See [ChipDefaults.chipBorder].
  */
 @Composable
 public fun CompactChip(
@@ -523,7 +687,8 @@
     interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
     contentPadding: PaddingValues = ChipDefaults.CompactChipContentPadding,
     shape: Shape = MaterialTheme.shapes.small,
-    ) {
+    border: ChipBorder = ChipDefaults.chipBorder()
+) {
     if (label != null) {
         Chip(
             label = {
@@ -534,10 +699,12 @@
                 }
             },
             onClick = onClick,
-            modifier = modifier.height(ChipDefaults.CompactChipHeight)
+            modifier = modifier
+                .height(ChipDefaults.CompactChipHeight)
                 .padding(ChipDefaults.CompactChipTapTargetPadding),
             icon = icon,
             colors = colors,
+            border = border,
             enabled = enabled,
             interactionSource = interactionSource,
             shape = shape,
@@ -553,13 +720,16 @@
                 .width(ChipDefaults.IconOnlyCompactChipWidth)
                 .padding(ChipDefaults.CompactChipTapTargetPadding),
             colors = colors,
+            border = border,
             enabled = enabled,
             interactionSource = interactionSource,
             shape = shape,
             contentPadding = contentPadding
         ) {
             // Use a box to fill and center align the icon into the single slot of the Chip
-            Box(modifier = Modifier.fillMaxSize().wrapContentSize(align = Alignment.Center)) {
+            Box(modifier = Modifier
+                .fillMaxSize()
+                .wrapContentSize(align = Alignment.Center)) {
                 if (icon != null) {
                     icon()
                 }
@@ -569,6 +739,95 @@
 }
 
 /**
+ * A compact Outlined Wear Material Chip that offers two slots and a specific layout for an icon and
+ * label. Both the icon and label are optional however it is expected that at least one will be
+ * provided.
+ *
+ * The [CompactChip] is Stadium shaped and has a max height designed to take no more than one line
+ * of text of [Typography.caption1] style and/or one icon. The default max height is
+ * [ChipDefaults.CompactChipHeight]. This includes a visible chip height of 32.dp and
+ * 8.dp of padding above and below the chip in order to meet accessibility guidelines that
+ * request a minimum of 48.dp height and width of tappable area.
+ *
+ * If a icon is provided then the labels should be "start" aligned, e.g. left aligned in ltr so that
+ * the text starts next to the icon.
+ *
+ * The items are laid out as follows.
+ *
+ * 1. If a label is provided then the chip will be laid out with the optional icon at the start of a
+ * row followed by the label with a default max height of [ChipDefaults.CompactChipHeight].
+ *
+ * 2. If only an icon is provided it will be laid out vertically and horizontally centered with a
+ * default height of [ChipDefaults.CompactChipHeight] and the default width of
+ * [ChipDefaults.IconOnlyCompactChipWidth]
+ *
+ * If neither icon nor label is provided then the chip will displayed like an icon only chip but
+ * with no contents and [ChipColors.background()] color.
+ *
+ * the [OutlinedCompactChip] has a transparent background, a thin border and contents which are
+ * colored with the theme primary color. Colors can be obtained and customized using
+ * [ChipDefaults.outlinedChipColors()].
+ *
+ * Chips can be enabled or disabled. A disabled chip will not respond to click events.
+ *
+ * Example of a [OutlinedCompactChip] with icon and single line of label text:
+ * @sample androidx.wear.compose.material.samples.OutlinedCompactChipWithIconAndLabel
+ *
+ * For more information, see the
+ * [Chips](https://developer.android.com/training/wearables/components/chips)
+ * guide.
+ *
+ * @param onClick Will be called when the user clicks the chip
+ * @param modifier Modifier to be applied to the chip
+ * @param label A slot for providing the chip's main label. The contents are expected to be text
+ * which is "start" aligned if there is an icon preset and "center" aligned if not.
+ * @param icon A slot for providing the chip's icon. The contents are expected to be a horizontally
+ * and vertically aligned icon of size [ChipDefaults.SmallIconSize] when used with a label or
+ * [ChipDefaults.IconSize] when used as the only content in the CompactChip. In order to correctly
+ * render when the Chip is not enabled the icon must set its alpha value to [LocalContentAlpha].
+ * @param colors [ChipColors] that will be used to resolve the background and content color for
+ * this chip in different states. See [ChipDefaults.outlinedChipColors]. Defaults to
+ * [ChipDefaults.primaryChipColors]
+ * @param enabled Controls the enabled state of the chip. When `false`, this chip will not
+ * be clickable
+ * @param interactionSource The [MutableInteractionSource] representing the stream of
+ * [Interaction]s for this Chip. You can create and pass in your own remembered
+ * [MutableInteractionSource] if you want to observe [Interaction]s and customize the
+ * appearance / behavior of this Chip in different [Interaction]s.
+ * @param contentPadding The spacing values to apply internally between the container and the
+ * content
+ * @param shape Defines the chip's shape. It is strongly recommended to use the default as this
+ * shape is a key characteristic of the Wear Material Theme
+ * @param border [ChipBorder] that will be used to resolve the border for this chip in different
+ * states. See [ChipDefaults.outlinedChipBorder].
+ */
+@Composable
+public fun OutlinedCompactChip(
+    onClick: () -> Unit,
+    modifier: Modifier = Modifier,
+    label: (@Composable RowScope.() -> Unit)? = null,
+    icon: (@Composable BoxScope.() -> Unit)? = null,
+    colors: ChipColors = ChipDefaults.outlinedChipColors(),
+    enabled: Boolean = true,
+    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+    contentPadding: PaddingValues = ChipDefaults.CompactChipContentPadding,
+    shape: Shape = MaterialTheme.shapes.small,
+    border: ChipBorder = ChipDefaults.outlinedChipBorder()
+) =
+    CompactChip(
+        onClick = onClick,
+        modifier = modifier,
+        label = label,
+        icon = icon,
+        colors = colors,
+        enabled = enabled,
+        interactionSource = interactionSource,
+        contentPadding = contentPadding,
+        shape = shape,
+        border = border
+    )
+
+/**
  * Represents the background and content colors used in a chip in different states.
  *
  * See [ChipDefaults.primaryChipColors] for the default colors used in a primary styled [Chip].
@@ -611,6 +870,20 @@
 }
 
 /**
+ * Represents the border stroke used in a [Chip] in different states.
+ */
+@Stable
+public interface ChipBorder {
+    @Composable
+    /**
+     * Represents the border stroke for this chip, depending on [enabled] or null if no border
+     *
+     * @param enabled Whether the chip is enabled
+     */
+    public fun borderStroke(enabled: Boolean): State<BorderStroke?>
+}
+
+/**
  * Contains the default values used by [Chip]
  */
 public object ChipDefaults {
@@ -618,7 +891,7 @@
     /**
      * Creates a [ChipColors] that represents the default background and content colors for a
      * primary [Chip]. Primary chips have a colored background with a contrasting content color. If
-     * a chip is disabled then the color will have an alpha([ContentAlpha.disabled]) value applied.
+     * a chip is disabled then the colors will have an alpha([ContentAlpha.disabled]) value applied.
      *
      * @param backgroundColor The background color of this [Chip] when enabled
      * @param contentColor The content color of this [Chip] when enabled
@@ -648,7 +921,7 @@
      * activity, such as a music track that is playing.
      *
      * Gradient background chips should have a content color that contrasts with the background
-     * gradient. If a chip is disabled then the color will have an alpha([ContentAlpha.disabled])
+     * gradient. If a chip is disabled then the colors will have an alpha([ContentAlpha.disabled])
      * value applied.
      *
      * @param startBackgroundColor The background color used at the start of the gradient of this
@@ -713,7 +986,7 @@
     /**
      * Creates a [ChipColors] that represents the default background and content colors for a
      * secondary [Chip]. Secondary chips have a muted background with a contrasting content color.
-     * If a chip is disabled then the color will have an alpha([ContentAlpha.disabled]) value
+     * If a chip is disabled then the colors will have an alpha([ContentAlpha.disabled]) value
      * applied.
      *
      * @param backgroundColor The background color of this [Chip] when enabled
@@ -742,7 +1015,7 @@
      * colors for a child [Chip]. Child chips have a transparent background and use a default
      * content color of [Colors.onSurface].
      *
-     * If a chip is disabled then the color will have an alpha([ContentAlpha.disabled]) value
+     * If a chip is disabled then the colors will have an alpha([ContentAlpha.disabled]) value
      * applied.
      *
      * @param contentColor The content color of this [Chip] when enabled
@@ -822,6 +1095,70 @@
         )
     }
 
+    /**
+     * Creates a [ChipColors] for an outline [Chip]. Outline chips have a transparent background
+     * with a thin border.
+     *
+     * If a chip is disabled then the colors will have an alpha([ContentAlpha.disabled]) value
+     * applied.
+     *
+     * @param contentColor The content color of this [Chip] when enabled
+     * @param secondaryContentColor The secondary content color of this [Chip] when enabled, used
+     * for secondaryLabel content
+     * @param iconColor The icon color of this [Chip] when enabled, used for icon content
+     */
+    @Composable
+    public fun outlinedChipColors(
+        contentColor: Color = MaterialTheme.colors.primary,
+        secondaryContentColor: Color = contentColor,
+        iconColor: Color = contentColor,
+    ): ChipColors {
+        return chipColors(
+            backgroundColor = Color.Transparent,
+            contentColor = contentColor,
+            secondaryContentColor = secondaryContentColor,
+            iconColor = iconColor,
+            disabledBackgroundColor = Color.Transparent,
+        )
+    }
+
+    /**
+     * Creates a default (no border) [ChipBorder] for a [Chip]
+     *
+     * @param borderStroke The border for this [Chip] when enabled
+     * @param disabledBorderStroke The border to use for this [Chip] when disabled
+     */
+    @Composable
+    public fun chipBorder(
+        borderStroke: BorderStroke? = null,
+        disabledBorderStroke: BorderStroke? = null
+    ): ChipBorder {
+        return DefaultChipBorder(
+            borderStroke = borderStroke,
+            disabledBorderStroke = disabledBorderStroke
+        )
+    }
+
+    /**
+     * Creates a [ChipBorder] for an [OutlinedChip]
+     *
+     * @param borderColor The color to use for the border for this [OutlinedChip] when enabled
+     * @param disabledBorderColor The color to use for the border for this [OutlinedChip] when
+     * disabled
+     * @param borderWidth The width to use for the border for this [OutlinedChip]
+     */
+    @Composable
+    public fun outlinedChipBorder(
+        borderColor: Color = MaterialTheme.colors.primaryVariant.copy(alpha = 0.6f),
+        disabledBorderColor: Color = borderColor.copy(alpha = ContentAlpha.disabled),
+        borderWidth: Dp = 2.dp
+    ): ChipBorder {
+        return DefaultChipBorder(
+            borderStroke = BorderStroke(borderWidth, borderColor),
+            disabledBorderStroke = BorderStroke(borderWidth, disabledBorderColor)
+        )
+    }
+
     private val ChipHorizontalPadding = 14.dp
     private val ChipVerticalPadding = 6.dp
 
@@ -933,7 +1270,7 @@
         disabledBackgroundColor = disabledBackgroundColor,
         disabledContentColor = disabledContentColor,
         disabledSecondaryContentColor = disabledSecondaryContentColor,
-        disabledIconColor = disabledIconColor,
+        disabledIconColor = disabledIconColor
     )
 }
 
@@ -949,7 +1286,7 @@
     private val disabledBackgroundPainter: Painter,
     private val disabledContentColor: Color,
     private val disabledSecondaryContentColor: Color,
-    private val disabledIconColor: Color,
+    private val disabledIconColor: Color
 ) : ChipColors {
 
     constructor(
@@ -1029,3 +1366,36 @@
         return result
     }
 }
+
+/**
+ * Default [ChipBorder] implementation.
+ */
+@Immutable
+private class DefaultChipBorder(
+    private val borderStroke: BorderStroke? = null,
+    private val disabledBorderStroke: BorderStroke? = null
+) : ChipBorder {
+    @Composable
+    override fun borderStroke(enabled: Boolean): State<BorderStroke?> {
+        return rememberUpdatedState(if (enabled) borderStroke else disabledBorderStroke)
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null) return false
+        if (this::class != other::class) return false
+
+        other as DefaultChipBorder
+
+        if (borderStroke != other.borderStroke) return false
+        if (disabledBorderStroke != other.disabledBorderStroke) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = borderStroke.hashCode()
+        result = 31 * result + disabledBorderStroke.hashCode()
+        return result
+    }
+}
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ButtonDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ButtonDemo.kt
index 16bd733..891a178 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ButtonDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ButtonDemo.kt
@@ -40,6 +40,8 @@
 import androidx.wear.compose.material.CompactButton
 import androidx.wear.compose.material.ListHeader
 import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.OutlinedButton
+import androidx.wear.compose.material.OutlinedCompactButton
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.ToggleButton
 import androidx.wear.compose.material.rememberScalingLazyListState
@@ -112,140 +114,198 @@
     var enabled by remember { mutableStateOf(true) }
     val context = LocalContext.current
 
-    Column(
+    ScalingLazyColumnWithRSB(
         modifier = Modifier.fillMaxSize(),
-        verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
         horizontalAlignment = Alignment.CenterHorizontally
     ) {
-        Row(
-            horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
-            Button(
-                onClick = {
-                    Toast.makeText(
-                        context,
-                        "Button: Override primary colors", Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ButtonDefaults.primaryButtonColors(
-                    backgroundColor = AlternatePrimaryColor1,
-                ),
-                enabled = enabled,
-            ) {
-                DemoIcon(R.drawable.ic_accessibility_24px)
-            }
-            Button(
-                onClick = {
-                    Toast.makeText(
-                        context,
-                        "Button: Primary colors", Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ButtonDefaults.primaryButtonColors(),
-                enabled = enabled,
-            ) {
-                DemoIcon(R.drawable.ic_accessibility_24px)
+        item {
+            ListHeader {
+                Text(
+                    text = "Styles (Click for details)",
+                )
             }
         }
-        Text(
-            text = "Styles (Click for details)",
-            style = MaterialTheme.typography.body2,
-            color = Color.White
-        )
-        Row(
-            horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
-            Button(
-                onClick = {
-                    Toast.makeText(
-                        context,
-                        "Button: Secondary, $enabled", Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ButtonDefaults.secondaryButtonColors(),
-                enabled = enabled,
+        item {
+            Row(
+                horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
+                verticalAlignment = Alignment.CenterVertically
             ) {
-                DemoIcon(R.drawable.ic_accessibility_24px)
-            }
-            Button(
-                onClick = {
-                    Toast.makeText(
-                        context,
-                        "Button: Small, icon only, $enabled", Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ButtonDefaults.iconButtonColors(),
-                modifier = Modifier.size(ButtonDefaults.SmallButtonSize),
-                enabled = enabled
-            ) {
-                DemoIcon(R.drawable.ic_accessibility_24px)
-            }
-            Button(
-                onClick = {
-                    Toast.makeText(
-                        context,
-                        "Button: Large, icon only, $enabled", Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ButtonDefaults.iconButtonColors(),
-                modifier = Modifier.size(ButtonDefaults.LargeButtonSize),
-                enabled = enabled
-            ) {
-                DemoIcon(R.drawable.ic_accessibility_24px)
+                Button(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Secondary, $enabled", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ButtonDefaults.secondaryButtonColors(),
+                    enabled = enabled,
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+                Button(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Primary colors", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ButtonDefaults.primaryButtonColors(),
+                    enabled = enabled,
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
             }
         }
-        Row(
-            horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
-        Button(
-                onClick = {
-                    Toast.makeText(
-                        context,
-                        "Button: Custom Shape", Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ButtonDefaults.secondaryButtonColors(),
-                modifier = Modifier,
-                enabled = enabled,
-                shape = CutCornerShape(4.dp)
+        item {
+            Row(
+                horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
+                verticalAlignment = Alignment.CenterVertically
             ) {
-                DemoIcon(R.drawable.ic_accessibility_24px)
-            }
-            CompactButton(
-                onClick = {
-                    Toast.makeText(
-                        context,
-                        "Button: Compact Button with Custom Shape", Toast.LENGTH_LONG
-                    ).show()
-                },
-                colors = ButtonDefaults.secondaryButtonColors(),
-                modifier = Modifier,
-                enabled = enabled,
-                shape = CutCornerShape(4.dp)
-            ) {
-                DemoIcon(R.drawable.ic_accessibility_24px)
+                Button(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Small, icon only, $enabled", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ButtonDefaults.iconButtonColors(),
+                    modifier = Modifier.size(ButtonDefaults.SmallButtonSize),
+                    enabled = enabled
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+                Button(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Large, icon only, $enabled", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ButtonDefaults.iconButtonColors(),
+                    modifier = Modifier.size(ButtonDefaults.LargeButtonSize),
+                    enabled = enabled
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
             }
         }
-        Row(
-            horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
-            verticalAlignment = Alignment.CenterVertically
-        ) {
-            Text(
-                text = "Buttons Enabled",
-                style = MaterialTheme.typography.caption2,
-                color = Color.White
-            )
-            ToggleButton(
-                checked = enabled,
-                onCheckedChange = {
-                    enabled = it
-                },
-                modifier = Modifier.size(ButtonDefaults.SmallButtonSize),
+        item {
+            Row(
+                horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
+                verticalAlignment = Alignment.CenterVertically
             ) {
-                DemoIcon(R.drawable.ic_check_24px)
+                OutlinedButton(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Outlined, $enabled", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    enabled = enabled,
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+                OutlinedCompactButton(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Outlined Compact, $enabled", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    enabled = enabled,
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+            }
+        }
+        item {
+            Row(
+                horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
+                verticalAlignment = Alignment.CenterVertically
+            ) {
+                Button(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Custom Shape", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ButtonDefaults.secondaryButtonColors(),
+                    modifier = Modifier,
+                    enabled = enabled,
+                    shape = CutCornerShape(4.dp)
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+                CompactButton(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Compact Button with Custom Shape", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ButtonDefaults.secondaryButtonColors(),
+                    modifier = Modifier,
+                    enabled = enabled,
+                    shape = CutCornerShape(4.dp)
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+            }
+        }
+        item {
+            Row(
+                horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
+                verticalAlignment = Alignment.CenterVertically
+            ) {
+                OutlinedCompactButton(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Outlined Compact Button with Custom Shape", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    modifier = Modifier,
+                    enabled = enabled,
+                    shape = CutCornerShape(4.dp)
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+                Button(
+                    onClick = {
+                        Toast.makeText(
+                            context,
+                            "Button: Override primary colors", Toast.LENGTH_LONG
+                        ).show()
+                    },
+                    colors = ButtonDefaults.primaryButtonColors(
+                        backgroundColor = AlternatePrimaryColor1,
+                    ),
+                    enabled = enabled,
+                ) {
+                    DemoIcon(R.drawable.ic_accessibility_24px)
+                }
+            }
+        }
+        item {
+            Row(
+                horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
+                verticalAlignment = Alignment.CenterVertically
+            ) {
+                Text(
+                    text = "Buttons Enabled",
+                    style = MaterialTheme.typography.caption2,
+                    color = Color.White
+                )
+                ToggleButton(
+                    checked = enabled,
+                    onCheckedChange = {
+                        enabled = it
+                    },
+                    modifier = Modifier.size(ButtonDefaults.SmallButtonSize),
+                ) {
+                    DemoIcon(R.drawable.ic_check_24px)
+                }
             }
         }
     }
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt
index 9f93f1f..0276717 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ChipDemo.kt
@@ -39,6 +39,7 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalLayoutDirection
@@ -55,6 +56,8 @@
 import androidx.wear.compose.material.ListHeader
 import androidx.wear.compose.material.LocalContentColor
 import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.OutlinedChip
+import androidx.wear.compose.material.OutlinedCompactChip
 import androidx.wear.compose.material.ScalingLazyColumn
 import androidx.wear.compose.material.Text
 import androidx.wear.compose.material.ToggleButton
@@ -80,6 +83,7 @@
         }
         item {
             DemoLabelChip(
+                style = chipStyle,
                 label = "Single Label",
                 colors = chipColors(chipStyle),
                 enabled = enabled,
@@ -87,6 +91,7 @@
         }
         item {
             DemoLabelChip(
+                style = chipStyle,
                 label = "Standard chip with long label to show truncation which does not fit into" +
                     " 2 lines",
                 colors = chipColors(chipStyle),
@@ -102,6 +107,7 @@
         }
         item {
             DemoIconChip(
+                style = chipStyle,
                 colors = chipColors(chipStyle),
                 label = "Label with icon",
                 enabled = enabled,
@@ -109,6 +115,7 @@
         }
         item {
             DemoIconChip(
+                style = chipStyle,
                 colors = chipColors(chipStyle),
                 label = "Long label to show truncation which does not fit into" +
                     " 2 lines",
@@ -124,6 +131,7 @@
         }
         item {
             DemoLabelChip(
+                style = chipStyle,
                 label = "Main label and",
                 secondaryLabel = "Secondary label",
                 colors = chipColors(chipStyle),
@@ -132,6 +140,7 @@
         }
         item {
             DemoLabelChip(
+                style = chipStyle,
                 label = "Long label to show truncation which does not fit into" +
                     " 1 line",
                 secondaryLabel = "Secondary Label",
@@ -141,6 +150,7 @@
         }
         item {
             DemoIconChip(
+                style = chipStyle,
                 colors = chipColors(chipStyle),
                 label = "Label with icon and",
                 secondaryLabel = "Secondary Label",
@@ -149,6 +159,7 @@
         }
         item {
             DemoIconChip(
+                style = chipStyle,
                 colors = chipColors(chipStyle),
                 label = "Long label with truncation",
                 secondaryLabel = "Long secondary label to show truncation which does not fit into" +
@@ -157,19 +168,13 @@
             ) { DemoIcon(resourceId = R.drawable.ic_accessibility_24px) }
         }
         item {
-             Chip(
-                 label = {
-                     Text(
-                         text = "Chip with custom shape",
-                         maxLines = 1,
-                         overflow = TextOverflow.Ellipsis
-                     )
-                 },
-                 onClick = {},
-                 colors = chipColors(chipStyle),
-                 enabled = enabled,
-                 shape = CutCornerShape(4.dp)
-             )
+            DemoLabelChip(
+                style = chipStyle,
+                label = "Chip with custom shape",
+                colors = chipColors(chipStyle),
+                enabled = enabled,
+                shape = CutCornerShape(4.dp)
+            )
         }
         item {
             ChipCustomizer(
@@ -206,83 +211,63 @@
             )
         }
         item {
-            CompactChip(
+            DemoIconCompactChip(
                 onClick = {},
                 colors = chipColors(chipStyle),
-                label = {
-                    Text(
-                        text = "Label",
-                        textAlign = TextAlign.Center,
-                        modifier = Modifier.fillMaxWidth()
-                    )
-                },
+                label = "Label",
                 enabled = enabled,
+                style = chipStyle
             )
         }
         item {
-            CompactChip(
+            DemoIconCompactChip(
                 onClick = {},
                 colors = chipColors(chipStyle),
-                label = {
-                    Text(
-                        text = "Long label to show truncation which does not fit into 1 line",
-                        maxLines = 1,
-                        overflow = TextOverflow.Ellipsis,
-                        textAlign = TextAlign.Center,
-                        modifier = Modifier.fillMaxWidth()
-                    )
-                },
+                label = "Long label to show truncation which does not fit into 1 line",
                 enabled = enabled,
+                style = chipStyle
             )
         }
         item {
-            CompactChip(
+            DemoIconCompactChip(
                 onClick = {},
                 colors = chipColors(chipStyle),
-                label = {
-                    Text("Label with icon", maxLines = 1, overflow = TextOverflow.Ellipsis)
-                },
-                icon = {
-                    DemoIcon(
-                        resourceId = R.drawable.ic_accessibility_24px,
-                        modifier = Modifier.size(ChipDefaults.SmallIconSize)
-                            .wrapContentSize(align = Alignment.Center)
-                    )
-                 },
+                label = "Label with icon",
                 enabled = enabled,
-            )
+                style = chipStyle
+            ) {
+                DemoIcon(
+                    resourceId = R.drawable.ic_accessibility_24px,
+                    modifier = Modifier
+                        .size(ChipDefaults.SmallIconSize)
+                        .wrapContentSize(align = Alignment.Center)
+                )
+            }
         }
         item {
-            CompactChip(
+            DemoIconCompactChip(
                 onClick = {},
                 colors = chipColors(chipStyle),
-                label = {
-                    Text(
-                        "Label with icon to show truncation which does not fit into 1 line",
-                        maxLines = 1, overflow = TextOverflow.Ellipsis
-                    )
-                },
+                label =
+                "Label with icon to show truncation which does not fit into 1 line",
                 enabled = enabled,
-                icon = {
-                    DemoIcon(
-                        resourceId = R.drawable.ic_accessibility_24px,
-                        modifier = Modifier.size(ChipDefaults.SmallIconSize)
-                            .wrapContentSize(align = Alignment.Center)
-                    )
-                },
-            )
+                style = chipStyle
+            ) {
+                DemoIcon(
+                    resourceId = R.drawable.ic_accessibility_24px,
+                    modifier = Modifier
+                        .size(ChipDefaults.SmallIconSize)
+                        .wrapContentSize(align = Alignment.Center)
+                )
+            }
         }
         item {
-            CompactChip(
+            DemoIconCompactChip(
                 onClick = {},
                 colors = chipColors(chipStyle),
-                label = {
-                    Text(
-                        "Compact Chip with custom shape",
-                        maxLines = 1, overflow = TextOverflow.Ellipsis
-                    )
-                },
+                label = "Compact Chip with custom shape",
                 enabled = enabled,
+                style = chipStyle,
                 shape = CutCornerShape(4.dp)
             )
         }
@@ -312,6 +297,7 @@
         }
         item {
             DemoIconChip(
+                style = ChipStyle.Secondary,
                 label = "Chip with text icon",
                 colors = ChipDefaults.secondaryChipColors(),
                 enabled = enabled,
@@ -325,6 +311,7 @@
         }
         item {
             DemoIconChip(
+                style = ChipStyle.Secondary,
                 label = "Chip with text icon",
                 secondaryLabel = "And secondary label",
                 colors = ChipDefaults.secondaryChipColors(),
@@ -344,6 +331,7 @@
         }
         item {
             DemoIconChip(
+                style = ChipStyle.Secondary,
                 label = "App Title",
                 secondaryLabel = "Defaults",
                 colors = ChipDefaults.secondaryChipColors(),
@@ -354,6 +342,7 @@
         }
         item {
             DemoIconChip(
+                style = ChipStyle.Secondary,
                 label = "App title",
                 secondaryLabel = "Default gradient",
                 colors = ChipDefaults.gradientBackgroundChipColors(),
@@ -364,6 +353,7 @@
         }
         item {
             DemoIconChip(
+                style = ChipStyle.Secondary,
                 label = "Custom Gradient Color",
                 secondaryLabel = "Matching Secondary Label Color",
                 secondaryLabelColor = AlternatePrimaryColor3,
@@ -423,12 +413,14 @@
             }
             item {
                 DemoLabelChip(
+                    style = ChipStyle.Primary,
                     label = "Standard chip",
                     colors = ChipDefaults.primaryChipColors(),
                 )
             }
             item {
                 DemoLabelChip(
+                    style = ChipStyle.Primary,
                     label = "Standard chip with long label to show truncation " +
                         "which does not fit into 2 lines",
                     colors = ChipDefaults.primaryChipColors(),
@@ -436,6 +428,7 @@
             }
             item {
                 DemoIconChip(
+                    style = ChipStyle.Primary,
                     colors = ChipDefaults.primaryChipColors(),
                     label = "Standard chip with ",
                     secondaryLabel = "Secondary Label",
@@ -461,6 +454,7 @@
             }
             item {
                 DemoIconChip(
+                    style = ChipStyle.Secondary,
                     label = "Chip with text icon",
                     colors = ChipDefaults.secondaryChipColors(),
                 ) {
@@ -473,6 +467,7 @@
             }
             item {
                 DemoIconChip(
+                    style = ChipStyle.Secondary,
                     label = "Standard chip with",
                     secondaryLabel = "Default gradient color",
                     colors = ChipDefaults.gradientBackgroundChipColors(),
@@ -502,6 +497,7 @@
         item {
             MaterialTheme(colors = MaterialTheme.colors.copy(primary = AlternatePrimaryColor1)) {
                 DemoIconChip(
+                    style = ChipStyle.Primary,
                     label = "Overridden Theme Primary + Icon",
                     colors = ChipDefaults.primaryChipColors(),
                     enabled = enabled,
@@ -601,6 +597,7 @@
     ) {
         item {
             DemoLabelChip(
+                style = ChipStyle.Secondary,
                 label = "Custom background image",
                 colors = ChipDefaults.imageBackgroundChipColors(
                     backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1),
@@ -610,6 +607,7 @@
         }
         item {
             DemoLabelChip(
+                style = ChipStyle.Secondary,
                 label = "Custom background image",
                 secondaryLabel = "with secondary label",
                 colors = ChipDefaults.imageBackgroundChipColors(
@@ -658,22 +656,26 @@
             modifier = Modifier.align(Alignment.CenterHorizontally),
             color = Color.White
         )
-        Row(
-            horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
-            modifier = Modifier.align(Alignment.CenterHorizontally).height(35.dp),
-        ) {
-            ChipStyle.values().forEach { style ->
-                ToggleButton(
-                    checked = chipStyle == style,
-                    onCheckedChange = {
-                        onChipStyleChanged(style)
-                    },
-                ) {
-                    Text(
-                        style = MaterialTheme.typography.caption2,
-                        modifier = Modifier.padding(4.dp),
-                        text = style.toString(),
+        var i = 0
+        while (i < ChipStyle.values().size) {
+            Row(
+                horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
+                modifier = Modifier
+                    .align(Alignment.CenterHorizontally)
+                    .height(35.dp),
+            ) {
+                ChipStyleChip(
+                    chipStyle = ChipStyle.values()[i],
+                    selectedChipStyle = chipStyle,
+                    onChipStyleChanged = onChipStyleChanged
+                )
+                if (++i < ChipStyle.values().size) {
+                    ChipStyleChip(
+                        chipStyle = ChipStyle.values()[i],
+                        selectedChipStyle = chipStyle,
+                        onChipStyleChanged = onChipStyleChanged
                     )
+                    i++
                 }
             }
         }
@@ -700,57 +702,157 @@
 }
 
 @Composable
+private fun ChipStyleChip(
+    chipStyle: ChipStyle,
+    selectedChipStyle: ChipStyle,
+    onChipStyleChanged: ((chipStyle: ChipStyle) -> Unit),
+) {
+    ToggleButton(
+        checked = selectedChipStyle == chipStyle,
+        onCheckedChange = {
+            onChipStyleChanged(chipStyle)
+        },
+    ) {
+        Text(
+            style = MaterialTheme.typography.caption2,
+            modifier = Modifier.padding(4.dp),
+            text = chipStyle.toString(),
+        )
+    }
+}
+
+@Composable
 private fun chipColors(chipStyle: ChipStyle) =
     when (chipStyle) {
         ChipStyle.Primary -> ChipDefaults.primaryChipColors()
         ChipStyle.Secondary -> ChipDefaults.secondaryChipColors()
         ChipStyle.Child -> ChipDefaults.childChipColors()
+        ChipStyle.Outlined -> ChipDefaults.outlinedChipColors()
     }
 
 enum class ChipStyle {
     Primary,
     Secondary,
-    Child
+    Child,
+    Outlined
+}
+
+@Composable
+internal fun DemoIconCompactChip(
+    colors: ChipColors,
+    label: String,
+    style: ChipStyle,
+    modifier: Modifier = Modifier,
+    enabled: Boolean = true,
+    onClick: (() -> Unit) = {},
+    shape: Shape = MaterialTheme.shapes.small,
+    content: @Composable (BoxScope.() -> Unit)? = null
+) {
+    val maxLabelLines = 1
+    if (style != ChipStyle.Outlined) {
+        CompactChip(
+            onClick = onClick,
+            modifier = modifier,
+            colors = colors,
+            label = {
+                Text(
+                    text = label, maxLines = maxLabelLines,
+                    overflow = TextOverflow.Ellipsis
+                )
+            },
+            icon = content,
+            shape = shape,
+            enabled = enabled,
+        )
+    } else {
+        OutlinedCompactChip(
+            onClick = onClick,
+            modifier = modifier,
+            colors = colors,
+            label = {
+                Text(
+                    text = label, maxLines = maxLabelLines,
+                    overflow = TextOverflow.Ellipsis
+                )
+            },
+            icon = content,
+            shape = shape,
+            enabled = enabled,
+        )
+    }
 }
 
 @Composable
 internal fun DemoIconChip(
     colors: ChipColors,
     label: String,
+    style: ChipStyle,
     modifier: Modifier = Modifier,
     secondaryLabel: String? = null,
     secondaryLabelColor: Color? = null,
     enabled: Boolean = true,
     onClick: (() -> Unit) = {},
+    shape: Shape = MaterialTheme.shapes.small,
     content: @Composable (BoxScope.() -> Unit)? = null
 ) {
     val maxLabelLines = if (secondaryLabel != null) 1 else 2
-    Chip(
-        onClick = onClick,
-        modifier = modifier,
-        colors = colors,
-        label = {
-            Text(
-                text = label, maxLines = maxLabelLines,
-                overflow = TextOverflow.Ellipsis
-            )
-        },
-        secondaryLabel = secondaryLabel?.let {
-            {
-                CompositionLocalProvider(
-                    LocalContentColor provides
-                        (secondaryLabelColor ?: colors.contentColor(enabled = enabled).value)
-                ) {
-                    Text(
-                        text = secondaryLabel,
-                        maxLines = 1, overflow = TextOverflow.Ellipsis
-                    )
+    if (style != ChipStyle.Outlined) {
+        Chip(
+            onClick = onClick,
+            modifier = modifier,
+            colors = colors,
+            label = {
+                Text(
+                    text = label, maxLines = maxLabelLines,
+                    overflow = TextOverflow.Ellipsis
+                )
+            },
+            secondaryLabel = secondaryLabel?.let {
+                {
+                    CompositionLocalProvider(
+                        LocalContentColor provides
+                            (secondaryLabelColor ?: colors.contentColor(enabled = enabled).value)
+                    ) {
+                        Text(
+                            text = secondaryLabel,
+                            maxLines = 1, overflow = TextOverflow.Ellipsis
+                        )
+                    }
                 }
-            }
-        },
-        icon = content,
-        enabled = enabled,
-    )
+            },
+            icon = content,
+            shape = shape,
+            enabled = enabled,
+        )
+    } else {
+        OutlinedChip(
+            onClick = onClick,
+            modifier = modifier,
+            colors = colors,
+            label = {
+                Text(
+                    text = label, maxLines = maxLabelLines,
+                    overflow = TextOverflow.Ellipsis
+                )
+            },
+            secondaryLabel = secondaryLabel?.let {
+                {
+                    CompositionLocalProvider(
+                        LocalContentColor provides
+                            (secondaryLabelColor ?: colors.contentColor(enabled = enabled).value)
+                    ) {
+                        Text(
+                            text = secondaryLabel,
+                            maxLines = 1, overflow = TextOverflow.Ellipsis
+                        )
+                    }
+                }
+            },
+            icon = content,
+            shape = shape,
+            enabled = enabled,
+        )
+    }
 }
 
 @Composable
@@ -760,7 +862,9 @@
     modifier: Modifier = Modifier,
     secondaryLabel: String? = null,
     onClick: (() -> Unit) = {},
-    enabled: Boolean = true
+    enabled: Boolean = true,
+    shape: Shape = MaterialTheme.shapes.small,
+    style: ChipStyle
 ) {
     DemoIconChip(
         colors = colors,
@@ -769,6 +873,8 @@
         secondaryLabel = secondaryLabel,
         enabled = enabled,
         onClick = onClick,
+        style = style,
+        shape = shape,
         content = null
     )
 }
\ No newline at end of file
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
index 90ad3e5..c8449e4 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
@@ -52,6 +52,10 @@
 import androidx.wear.compose.material.samples.InlineSliderSegmentedSample
 import androidx.wear.compose.material.samples.InlineSliderWithIntegerSample
 import androidx.wear.compose.material.samples.LargeButtonWithIcon
+import androidx.wear.compose.material.samples.OutlinedButtonWithIcon
+import androidx.wear.compose.material.samples.OutlinedChipWithIconAndLabel
+import androidx.wear.compose.material.samples.OutlinedCompactButtonWithIcon
+import androidx.wear.compose.material.samples.OutlinedCompactChipWithIconAndLabel
 import androidx.wear.compose.material.samples.ScalingLazyColumnEdgeAnchoredAndAnimatedScrollTo
 import androidx.wear.compose.material.samples.SimplePicker
 import androidx.wear.compose.material.samples.SimpleScaffoldWithScrollIndicator
@@ -287,9 +291,15 @@
                             Centralize { LargeButtonWithIcon() }
                         },
                         ComposableDemo("Button With Text") { Centralize { ButtonWithText() } },
+                        ComposableDemo("Outlined Button With Icon") {
+                            Centralize { OutlinedButtonWithIcon() }
+                        },
                         ComposableDemo("Compact Button With Icon") {
                             Centralize { CompactButtonWithIcon() }
                         },
+                        ComposableDemo("Outline Compact Button With Icon") {
+                            Centralize { OutlinedCompactButtonWithIcon() }
+                        },
                     )
                 ),
                 DemoCategory(
@@ -325,6 +335,11 @@
                                 ChipWithIconAndLabels()
                             }
                         },
+                        ComposableDemo("Outlined Chip With Icon And long Label") {
+                            Centralize(Modifier.padding(horizontal = 10.dp)) {
+                                OutlinedChipWithIconAndLabel()
+                            }
+                        },
                         ComposableDemo("Compact Chip With Icon And Label") {
                             Centralize(Modifier.padding(horizontal = 10.dp)) {
                                 CompactChipWithIconAndLabel()
@@ -340,6 +355,11 @@
                                 CompactChipWithIcon()
                             }
                         },
+                        ComposableDemo("Outlined Compact Chip With Icon and Label") {
+                            Centralize(Modifier.padding(horizontal = 10.dp)) {
+                                OutlinedCompactChipWithIconAndLabel()
+                            }
+                        },
                     )
                 ),
                 DemoCategory(
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScalingLazyColumnDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScalingLazyColumnDemo.kt
index 629f284..82d523e 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScalingLazyColumnDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScalingLazyColumnDemo.kt
@@ -85,13 +85,16 @@
             }
             Chip(
                 onClick = {},
-                colors = ChipDefaults.secondaryChipColors()) {
-                Text(
-                    modifier = Modifier.fillMaxWidth(),
-                    textAlign = TextAlign.Center,
-                    text = description,
-                    style = MaterialTheme.typography.caption3)
-            }
+                colors = ChipDefaults.secondaryChipColors(),
+                label = {
+                    Text(
+                        modifier = Modifier.fillMaxWidth(),
+                        textAlign = TextAlign.Center,
+                        text = description,
+                        style = MaterialTheme.typography.caption3
+                    )
+                }
+            )
         }
     }
 }
@@ -110,6 +113,7 @@
         }
         item {
             DemoIconChip(
+                style = ChipStyle.Secondary,
                 label = "App Title",
                 secondaryLabel = "Defaults",
                 colors = ChipDefaults.secondaryChipColors(),
@@ -138,6 +142,7 @@
         }
         item {
             DemoIconChip(
+                style = ChipStyle.Secondary,
                 label = "App Title",
                 secondaryLabel = "Defaults",
                 colors = ChipDefaults.secondaryChipColors(),
diff --git a/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/BaselineActivity.kt b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/BaselineActivity.kt
index b384499..86501d2 100644
--- a/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/BaselineActivity.kt
+++ b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/BaselineActivity.kt
@@ -275,8 +275,9 @@
         ListHeader { Text("Chips") }
         Chip(
             onClick = {},
-            colors = ChipDefaults.primaryChipColors()
-        ) { Text("Chip") }
+            colors = ChipDefaults.primaryChipColors(),
+            label = { Text("Chip") }
+        )
         CompactChip(onClick = {}, label = { Text("CompactChip") })
         ToggleChip(
             checked = true,
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index 740172d..c6e980f 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -764,7 +764,9 @@
                         10.0f,
                         100.0f,
                         ComplicationText.EMPTY
-                    ).build(),
+                    )
+                        .setText(PlainComplicationText.Builder("Battery").build())
+                        .build(),
                 EXAMPLE_CANVAS_WATCHFACE_RIGHT_COMPLICATION_ID to
                     LongTextComplicationData.Builder(
                         PlainComplicationText.Builder("Test").build(),
diff --git a/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt b/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
index ffa9876..7f5215b 100644
--- a/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
@@ -1,6 +1,14 @@
 // Signature format: 4.0
 package androidx.wear.watchface.complications.data {
 
+  @androidx.wear.watchface.complications.data.ComplicationExperimental public final class ColorRamp {
+    ctor public ColorRamp(@ColorInt int[] colors, boolean interpolated);
+    method public int[] getColors();
+    method public boolean getInterpolated();
+    property public final int[] colors;
+    property public final boolean interpolated;
+  }
+
   public abstract sealed class ComplicationData {
     method public final android.content.ComponentName? getDataSource();
     method public java.time.Instant getNextChangeInstant(java.time.Instant afterInstant);
@@ -36,7 +44,9 @@
   public enum ComplicationType {
     method public static androidx.wear.watchface.complications.data.ComplicationType valueOf(String name) throws java.lang.IllegalArgumentException;
     method public static androidx.wear.watchface.complications.data.ComplicationType[] values();
+    enum_constant @androidx.wear.watchface.complications.data.ComplicationExperimental public static final androidx.wear.watchface.complications.data.ComplicationType DISCRETE_RANGED_VALUE;
     enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType EMPTY;
+    enum_constant @androidx.wear.watchface.complications.data.ComplicationExperimental public static final androidx.wear.watchface.complications.data.ComplicationType GOAL_PROGRESS;
     enum_constant @androidx.wear.watchface.complications.data.ComplicationExperimental public static final androidx.wear.watchface.complications.data.ComplicationType LIST;
     enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType LONG_TEXT;
     enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType MONOCHROMATIC_IMAGE;
@@ -48,6 +58,7 @@
     enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType RANGED_VALUE;
     enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SHORT_TEXT;
     enum_constant public static final androidx.wear.watchface.complications.data.ComplicationType SMALL_IMAGE;
+    enum_constant @androidx.wear.watchface.complications.data.ComplicationExperimental public static final androidx.wear.watchface.complications.data.ComplicationType WEIGHTED_ELEMENTS;
   }
 
   public final class CountDownTimeReference {
@@ -65,11 +76,72 @@
   public final class DataKt {
   }
 
+  @androidx.wear.watchface.complications.data.ComplicationExperimental public final class DiscreteRangedValueComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public int getMax();
+    method public int getMin();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    method public int getValue();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final int max;
+    property public final int min;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    property public final int value;
+    field public static final int PLACEHOLDER;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class DiscreteRangedValueComplicationData.Builder {
+    ctor public DiscreteRangedValueComplicationData.Builder(int value, int min, int max, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData build();
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.DiscreteRangedValueComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
   public final class EmptyComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
     ctor public EmptyComplicationData();
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
   }
 
+  @androidx.wear.watchface.complications.data.ComplicationExperimental public final class GoalProgressComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.ColorRamp? getColorRamp();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public float getTargetValue();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    method public float getValue();
+    property @androidx.wear.watchface.complications.data.ComplicationExperimental public final androidx.wear.watchface.complications.data.ColorRamp? colorRamp;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final float targetValue;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    property public final float value;
+    field public static final float PLACEHOLDER;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class GoalProgressComplicationData.Builder {
+    ctor public GoalProgressComplicationData.Builder(float value, float targetValue, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData build();
+    method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setColorRamp(androidx.wear.watchface.complications.data.ColorRamp? colorRamp);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.GoalProgressComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
   public final class ImageKt {
   }
 
@@ -239,7 +311,7 @@
   }
 
   public final class RangedValueComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
-    method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.RangedValueComplicationData.ColorRamp? getColorRamp();
+    method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.ColorRamp? getColorRamp();
     method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
     method public float getMax();
     method public float getMin();
@@ -247,8 +319,7 @@
     method public androidx.wear.watchface.complications.data.ComplicationText? getText();
     method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
     method public float getValue();
-    method @androidx.wear.watchface.complications.data.ComplicationExperimental public int getValueType();
-    property @androidx.wear.watchface.complications.data.ComplicationExperimental public final androidx.wear.watchface.complications.data.RangedValueComplicationData.ColorRamp? colorRamp;
+    property @androidx.wear.watchface.complications.data.ComplicationExperimental public final androidx.wear.watchface.complications.data.ColorRamp? colorRamp;
     property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
     property public final float max;
     property public final float min;
@@ -256,7 +327,6 @@
     property public final androidx.wear.watchface.complications.data.ComplicationText? text;
     property public final androidx.wear.watchface.complications.data.ComplicationText? title;
     property public final float value;
-    property @androidx.wear.watchface.complications.data.ComplicationExperimental public final int valueType;
     field public static final float PLACEHOLDER;
     field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
   }
@@ -264,22 +334,13 @@
   public static final class RangedValueComplicationData.Builder {
     ctor public RangedValueComplicationData.Builder(float value, float min, float max, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData build();
-    method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setColorRamp(androidx.wear.watchface.complications.data.RangedValueComplicationData.ColorRamp? colorRamp);
+    method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setColorRamp(androidx.wear.watchface.complications.data.ColorRamp? colorRamp);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
     method public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
-    method @androidx.wear.watchface.complications.data.ComplicationExperimental public androidx.wear.watchface.complications.data.RangedValueComplicationData.Builder setValueType(int valueType);
-  }
-
-  @androidx.wear.watchface.complications.data.ComplicationExperimental public static final class RangedValueComplicationData.ColorRamp {
-    ctor public RangedValueComplicationData.ColorRamp(@ColorInt int minColor, @ColorInt int maxColor);
-    method public int getMaxColor();
-    method public int getMinColor();
-    property public final int maxColor;
-    property public final int minColor;
   }
 
   public final class ShortTextComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
@@ -419,6 +480,40 @@
   public final class TypeKt {
   }
 
+  @androidx.wear.watchface.complications.data.ComplicationExperimental public final class WeightedElementsComplicationData extends androidx.wear.watchface.complications.data.ComplicationData {
+    method public androidx.wear.watchface.complications.data.ComplicationText? getContentDescription();
+    method public java.util.List<androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Element> getElements();
+    method public androidx.wear.watchface.complications.data.MonochromaticImage? getMonochromaticImage();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getText();
+    method public androidx.wear.watchface.complications.data.ComplicationText? getTitle();
+    property public final androidx.wear.watchface.complications.data.ComplicationText? contentDescription;
+    property public final java.util.List<androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Element> elements;
+    property public final androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? text;
+    property public final androidx.wear.watchface.complications.data.ComplicationText? title;
+    field public static final java.util.List<androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Element> PLACEHOLDER;
+    field public static final androidx.wear.watchface.complications.data.ComplicationType TYPE;
+  }
+
+  public static final class WeightedElementsComplicationData.Builder {
+    ctor public WeightedElementsComplicationData.Builder(java.util.List<androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Element> elements, androidx.wear.watchface.complications.data.ComplicationText contentDescription);
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData build();
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setDataSource(android.content.ComponentName? dataSource);
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setMonochromaticImage(androidx.wear.watchface.complications.data.MonochromaticImage? monochromaticImage);
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setTapAction(android.app.PendingIntent? tapAction);
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setText(androidx.wear.watchface.complications.data.ComplicationText? text);
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setTitle(androidx.wear.watchface.complications.data.ComplicationText? title);
+    method public androidx.wear.watchface.complications.data.WeightedElementsComplicationData.Builder setValidTimeRange(androidx.wear.watchface.complications.data.TimeRange? validTimeRange);
+  }
+
+  public static final class WeightedElementsComplicationData.Element {
+    ctor public WeightedElementsComplicationData.Element(@FloatRange(from=0.0, fromInclusive=false) float weight, @ColorInt int color);
+    method public int getColor();
+    method public float getWeight();
+    property public final int color;
+    property public final float weight;
+  }
+
 }
 
 package androidx.wear.watchface.utility {
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
index 5a54260..f2876d3 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationData.java
@@ -158,8 +158,8 @@
      * type, and the value within the range is expected to always be displayed.
      *
      * <p>The <i>icon</i> (and <i>burnInProtectionIcon</i>), <i>short title</i>, and <i>short
-     * text</i> fields are optional for this type. The watch face may choose which of these fields
-     * to display, if any.
+     * text</i> fields are optional for this type, but at least one must be defined. The watch face
+     * may choose which of these fields to display, if any.
      */
     public static final int TYPE_RANGED_VALUE = 5;
 
@@ -227,6 +227,47 @@
     /** Type that specifies a list of complication values. E.g. to support linear 3. */
     public static final int TYPE_LIST = 12;
 
+    /**
+     * Type used for complications which indicate progress towards a goal. The value may be
+     * accompanied by an icon and/or short text and title.
+     *
+     * <p>The <i>value</i>, and <i>target value</i> fields are required for this type, and the
+     * value is expected to always be displayed. The value must be >= 0 and may be > target value.
+     * E.g. 15000 out of a target of 10000 steps.
+     *
+     * <p>The <i>icon</i> (and <i>burnInProtectionIcon</i>), <i>short title</i>, and <i>short
+     * text</i> fields are optional for this type, but at least one must be defined. The watch face
+     * may choose which of these fields to display, if any.
+     */
+    public static final int TYPE_GOAL_PROGRESS = 13;
+
+    /**
+     * Type used for complications including a discrete integer value within a range, such as a
+     * 3/6 daily cups of water drunk. The value may be accompanied by an icon and/or short text
+     * and title.
+     *
+     * <p>The <i>value</i>, <i>min value</i>, and <i>max value</i> fields are required for this
+     * type, and the value within the range is expected to always be displayed.
+     *
+     * <p>The <i>icon</i> (and <i>burnInProtectionIcon</i>), <i>short title</i>, and <i>short
+     * text</i> fields are optional for this type, but at least one must be defined. The watch face
+     * may choose which of these fields to display, if any.
+     */
+    public static final int TYPE_DISCRETE_RANGED_VALUE = 14;
+
+    /**
+     * Type used for complications to display a series of weighted values e.g. in a pie chart. The
+     * weighted values may be accompanied by an icon and/or short text and title.
+     *
+     * <p>The <i>element weights</i> and <i>element colors</i> fields are required for this type,
+     * and the value within the range is expected to always be displayed.
+     *
+     * <p>The <i>icon</i> (and <i>burnInProtectionIcon</i>), <i>short title</i>, and <i>short
+     * text</i> fields are optional for this type, but at least one must be defined. The watch face
+     * may choose which of these fields to display, if any.
+     */
+    public static final int TYPE_WEIGHTED_ELEMENTS = 15;
+
     /** @hide */
     @IntDef({IMAGE_STYLE_PHOTO, IMAGE_STYLE_ICON})
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@@ -251,20 +292,24 @@
      */
     public static final int IMAGE_STYLE_ICON = 2;
 
-    // Originally it was planned to support both content and image content descriptions.
+    private static final String FIELD_COLOR_RAMP = "COLOR_RAMP";
+    private static final String FIELD_COLOR_RAMP_INTERPOLATED = "COLOR_RAMP_INTERPOLATED";
     private static final String FIELD_DATA_SOURCE = "FIELD_DATA_SOURCE";
+    private static final String FIELD_ELEMENT_COLORS = "ELEMENT_COLORS";
+    private static final String FIELD_ELEMENT_WEIGHTS = "ELEMENT_WEIGHTS";
     private static final String FIELD_END_TIME = "END_TIME";
     private static final String FIELD_ICON = "ICON";
     private static final String FIELD_ICON_BURN_IN_PROTECTION = "ICON_BURN_IN_PROTECTION";
     private static final String FIELD_IMAGE_STYLE = "IMAGE_STYLE";
+    private static final String FIELD_INT_MAX_VALUE = "INT_MAX_VALUE";
+    private static final String FIELD_INT_MIN_VALUE = "INT_MIN_VALUE";
+    private static final String FIELD_INT_VALUE = "INT_VALUE";
     private static final String FIELD_LARGE_IMAGE = "LARGE_IMAGE";
     private static final String FIELD_LIST_ENTRIES = "LIST_ENTRIES";
     private static final String FIELD_LIST_ENTRY_TYPE = "LIST_ENTRY_TYPE";
     private static final String FIELD_LIST_STYLE_HINT = "LIST_STYLE_HINT";
     private static final String FIELD_LONG_TITLE = "LONG_TITLE";
     private static final String FIELD_LONG_TEXT = "LONG_TEXT";
-    private static final String FIELD_MAX_COLOR = "MAX_COLOR";
-    private static final String FIELD_MIN_COLOR = "MIN_COLOR";
     private static final String FIELD_MAX_VALUE = "MAX_VALUE";
     private static final String FIELD_MIN_VALUE = "MIN_VALUE";
     private static final String FIELD_PLACEHOLDER_FIELDS = "PLACEHOLDER_FIELDS";
@@ -278,6 +323,7 @@
     private static final String FIELD_SHORT_TITLE = "SHORT_TITLE";
     private static final String FIELD_SHORT_TEXT = "SHORT_TEXT";
     private static final String FIELD_START_TIME = "START_TIME";
+    private static final String FIELD_TARGET_VALUE = "TARGET_VALUE";
     private static final String FIELD_TAP_ACTION = "TAP_ACTION";
     private static final String FIELD_TAP_ACTION_LOST = "FIELD_TAP_ACTION_LOST";
     private static final String FIELD_TIMELINE_START_TIME = "TIMELINE_START_TIME";
@@ -285,7 +331,6 @@
     private static final String FIELD_TIMELINE_ENTRIES = "TIMELINE";
     private static final String FIELD_TIMELINE_ENTRY_TYPE = "TIMELINE_ENTRY_TYPE";
     private static final String FIELD_VALUE = "VALUE";
-    private static final String FIELD_VALUE_TYPE = "VALUE_TYPE";
 
     // Originally it was planned to support both content and image content descriptions.
     private static final String FIELD_CONTENT_DESCRIPTION = "IMAGE_CONTENT_DESCRIPTION";
@@ -309,7 +354,10 @@
                     FIELD_PROTO_LAYOUT_INTERACTIVE,
                     FIELD_PROTO_LAYOUT_RESOURCES
             },
-            {FIELD_LIST_ENTRIES} // TYPE_LIST
+            {FIELD_LIST_ENTRIES}, // TYPE_LIST
+            {FIELD_VALUE, FIELD_TARGET_VALUE}, // GOAL_PROGRESS
+            {FIELD_INT_VALUE, FIELD_INT_MIN_VALUE, FIELD_INT_MAX_VALUE}, // DISCRETE_RANGED_VALUE
+            {FIELD_ELEMENT_WEIGHTS, FIELD_ELEMENT_COLORS} // TYPE_WEIGHTED_ELEMENTS
     };
 
     // Used for validation. OPTIONAL_FIELDS[i] is an array containing all the fields which are
@@ -345,9 +393,8 @@
                     FIELD_TAP_ACTION,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE,
-                    FIELD_VALUE_TYPE,
-                    FIELD_MAX_COLOR,
-                    FIELD_MIN_COLOR
+                    FIELD_COLOR_RAMP,
+                    FIELD_COLOR_RAMP_INTERPOLATED
             }, // RANGED_VALUE
             {
                     FIELD_TAP_ACTION,
@@ -392,15 +439,44 @@
                     FIELD_VALUE,
                     FIELD_DATA_SOURCE
             },
-            { // TYPE_PROTO_LAYOUT
+            {
                     FIELD_TAP_ACTION, FIELD_CONTENT_DESCRIPTION, FIELD_DATA_SOURCE
-            },
-            { // TYPE_LIST
+            }, // TYPE_PROTO_LAYOUT
+            {
                     FIELD_TAP_ACTION,
                     FIELD_LIST_STYLE_HINT,
                     FIELD_CONTENT_DESCRIPTION,
                     FIELD_DATA_SOURCE
-            }
+            }, // TYPE_LIST
+            {
+                    FIELD_SHORT_TEXT,
+                    FIELD_SHORT_TITLE,
+                    FIELD_ICON,
+                    FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_TAP_ACTION,
+                    FIELD_CONTENT_DESCRIPTION,
+                    FIELD_DATA_SOURCE,
+                    FIELD_COLOR_RAMP,
+                    FIELD_COLOR_RAMP_INTERPOLATED
+            }, // TYPE_GOAL_PROGRESS
+            {
+                    FIELD_SHORT_TEXT,
+                    FIELD_SHORT_TITLE,
+                    FIELD_ICON,
+                    FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_TAP_ACTION,
+                    FIELD_CONTENT_DESCRIPTION,
+                    FIELD_DATA_SOURCE,
+            }, // DISCRETE_RANGED_VALUE
+            {
+                    FIELD_SHORT_TEXT,
+                    FIELD_SHORT_TITLE,
+                    FIELD_ICON,
+                    FIELD_ICON_BURN_IN_PROTECTION,
+                    FIELD_TAP_ACTION,
+                    FIELD_CONTENT_DESCRIPTION,
+                    FIELD_DATA_SOURCE,
+            }  // TYPE_WEIGHTED_ELEMENTS
     };
 
     @NonNull
@@ -442,7 +518,7 @@
 
     @RequiresApi(api = Build.VERSION_CODES.P)
     private static class SerializedForm implements Serializable {
-        private static final int VERSION_NUMBER = 11;
+        private static final int VERSION_NUMBER = 14;
 
         @NonNull
         ComplicationData mComplicationData;
@@ -504,23 +580,59 @@
             if (isFieldValidForType(FIELD_MAX_VALUE, type)) {
                 oos.writeFloat(mComplicationData.getRangedMaxValue());
             }
-            if (isFieldValidForType(FIELD_VALUE_TYPE, type)) {
-                oos.writeInt(mComplicationData.getValueType());
+            if (isFieldValidForType(FIELD_TARGET_VALUE, type)) {
+                oos.writeFloat(mComplicationData.getTargetValue());
             }
-            if (isFieldValidForType(FIELD_MAX_COLOR, type)) {
-                Integer maxColor = mComplicationData.getRangedMaxColor();
-                if (maxColor != null) {
+            if (isFieldValidForType(FIELD_INT_VALUE, type)) {
+                oos.writeInt(mComplicationData.getDiscreteRangedValue());
+            }
+            if (isFieldValidForType(FIELD_INT_MIN_VALUE, type)) {
+                oos.writeInt(mComplicationData.getDiscreteRangedMinValue());
+            }
+            if (isFieldValidForType(FIELD_INT_MAX_VALUE, type)) {
+                oos.writeInt(mComplicationData.getDiscreteRangedMaxValue());
+            }
+            if (isFieldValidForType(FIELD_COLOR_RAMP, type)) {
+                int[] colors = mComplicationData.getColorRamp();
+                if (colors != null) {
                     oos.writeBoolean(true);
-                    oos.writeInt(maxColor);
+                    oos.writeInt(colors.length);
+                    for (int color : colors) {
+                        oos.writeInt(color);
+                    }
                 } else {
                     oos.writeBoolean(false);
                 }
             }
-            if (isFieldValidForType(FIELD_MIN_COLOR, type)) {
-                Integer minColor = mComplicationData.getRangedMinColor();
-                if (minColor != null) {
+            if (isFieldValidForType(FIELD_COLOR_RAMP_INTERPOLATED, type)) {
+                Boolean isColorRampSmoothShaded = mComplicationData.isColorRampInterpolated();
+                if (isColorRampSmoothShaded != null) {
                     oos.writeBoolean(true);
-                    oos.writeInt(minColor);
+                    oos.writeBoolean(isColorRampSmoothShaded);
+                } else {
+                    oos.writeBoolean(false);
+                }
+            }
+            if (isFieldValidForType(FIELD_ELEMENT_WEIGHTS, type)) {
+                float[] weights = mComplicationData.getElementWeights();
+                if (weights != null) {
+                    oos.writeBoolean(true);
+                    oos.writeInt(weights.length);
+                    for (float weight : weights) {
+                        oos.writeFloat(weight);
+                    }
+                } else {
+                    oos.writeBoolean(false);
+                }
+            }
+            if (isFieldValidForType(FIELD_ELEMENT_COLORS, type)) {
+                int[] colors = mComplicationData.getElementColors();
+                if (colors != null) {
+                    oos.writeBoolean(true);
+                    oos.writeInt(colors.length);
+                    for (int color : colors) {
+                        oos.writeInt(color);
+                    }
                 } else {
                     oos.writeBoolean(false);
                 }
@@ -671,17 +783,44 @@
             if (isFieldValidForType(FIELD_MAX_VALUE, type)) {
                 fields.putFloat(FIELD_MAX_VALUE, ois.readFloat());
             }
-            if (isFieldValidForType(FIELD_VALUE_TYPE, type)) {
-                int valueType = ois.readInt();
-                if (valueType != 0) {
-                    fields.putInt(FIELD_VALUE_TYPE, valueType);
+            if (isFieldValidForType(FIELD_TARGET_VALUE, type)) {
+                fields.putFloat(FIELD_TARGET_VALUE, ois.readFloat());
+            }
+            if (isFieldValidForType(FIELD_INT_VALUE, type)) {
+                fields.putInt(FIELD_INT_VALUE, ois.readInt());
+            }
+            if (isFieldValidForType(FIELD_INT_MIN_VALUE, type)) {
+                fields.putInt(FIELD_INT_MIN_VALUE, ois.readInt());
+            }
+            if (isFieldValidForType(FIELD_INT_MAX_VALUE, type)) {
+                fields.putInt(FIELD_INT_MAX_VALUE, ois.readInt());
+            }
+            if (isFieldValidForType(FIELD_COLOR_RAMP, type) && ois.readBoolean()) {
+                int numColors = ois.readInt();
+                int[] colors = new int[numColors];
+                for (int i = 0; i < numColors; ++i) {
+                    colors[i] = ois.readInt();
                 }
+                fields.putIntArray(FIELD_COLOR_RAMP, colors);
             }
-            if (isFieldValidForType(FIELD_MAX_COLOR, type) && ois.readBoolean()) {
-                fields.putInt(FIELD_MAX_COLOR, ois.readInt());
+            if (isFieldValidForType(FIELD_COLOR_RAMP_INTERPOLATED, type) && ois.readBoolean()) {
+                fields.putBoolean(FIELD_COLOR_RAMP_INTERPOLATED, ois.readBoolean());
             }
-            if (isFieldValidForType(FIELD_MIN_COLOR, type) && ois.readBoolean()) {
-                fields.putInt(FIELD_MIN_COLOR, ois.readInt());
+            if (isFieldValidForType(FIELD_ELEMENT_WEIGHTS, type) && ois.readBoolean()) {
+                int numWeights = ois.readInt();
+                float[] weights = new float[numWeights];
+                for (int i = 0; i < numWeights; ++i) {
+                    weights[i] = ois.readFloat();
+                }
+                fields.putFloatArray(FIELD_ELEMENT_WEIGHTS, weights);
+            }
+            if (isFieldValidForType(FIELD_ELEMENT_COLORS, type) && ois.readBoolean()) {
+                int numColors = ois.readInt();
+                int[] colors = new int[numColors];
+                for (int i = 0; i < numColors; ++i) {
+                    colors[i] = ois.readInt();
+                }
+                fields.putIntArray(FIELD_ELEMENT_COLORS, colors);
             }
             if (isFieldValidForType(FIELD_START_TIME, type)) {
                 fields.putLong(FIELD_START_TIME, ois.readLong());
@@ -1033,42 +1172,127 @@
     }
 
     /**
-     * Returns the value type of a RangedValue complication, which may be used by the renderer to
-     * influence complication styling.
-     *
-     * <p>Valid only if the type of this complication data is {@link #TYPE_RANGED_VALUE}.
+     * Returns true if the ComplicationData contains a ranged max value. I.e. if
+     * {@link #getTargetValue} can succeed.
      */
-    public int getValueType() {
-        checkFieldValidForTypeWithoutThrowingException(FIELD_VALUE_TYPE, mType);
-        return mFields.getInt(FIELD_VALUE_TYPE, 0);
+    public boolean hasTargetValue() {
+        try {
+            return isFieldValidForType(FIELD_TARGET_VALUE, mType);
+        } catch (BadParcelableException e) {
+            return false;
+        }
     }
 
     /**
-     * Returns the color the minimum ranged value should be rendered with.
+     * Returns the <i>value</i> field for this complication.
      *
-     * <p>Valid only if the type of this complication data is {@link #TYPE_RANGED_VALUE}.
+     * <p>Valid only if the type of this complication data is {@link #TYPE_GOAL_PROGRESS}.
+     * Otherwise returns zero.
+     */
+    public float getTargetValue() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_TARGET_VALUE, mType);
+        return mFields.getFloat(FIELD_TARGET_VALUE);
+    }
+
+    /**
+     * Returns true if the ComplicationData contains a discrete integer ranged max value. I.e. if
+     * {@link #getDiscreteRangedValue} can succeed.
+     */
+    public boolean hasDiscreteRangedValue() {
+        try {
+            return isFieldValidForType(FIELD_INT_VALUE, mType);
+        } catch (BadParcelableException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the <i>discrete integer value</i> field for this complication.
+     *
+     * <p>Valid only if the type of this complication data is {@link #TYPE_DISCRETE_RANGED_VALUE}.
+     * Otherwise returns zero.
+     */
+    public int getDiscreteRangedValue() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_INT_VALUE, mType);
+        return mFields.getInt(FIELD_INT_VALUE);
+    }
+
+    /**
+     * Returns true if the ComplicationData contains a discrete integer ranged max value. I.e. if
+     * {@link #getDiscreteRangedMinValue} can succeed.
+     */
+    public boolean hasDiscreteRangedMinValue() {
+        try {
+            return isFieldValidForType(FIELD_INT_MIN_VALUE, mType);
+        } catch (BadParcelableException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the <i>discrete integer min value</i> field for this complication.
+     *
+     * <p>Valid only if the type of this complication data is {@link #TYPE_DISCRETE_RANGED_VALUE}.
+     * Otherwise returns zero.
+     */
+    public int getDiscreteRangedMinValue() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_INT_MIN_VALUE, mType);
+        return mFields.getInt(FIELD_INT_MIN_VALUE);
+    }
+
+    /**
+     * Returns true if the ComplicationData contains a discrete integer ranged max value. I.e. if
+     * {@link #getDiscreteRangedMaxValue} can succeed.
+     */
+    public boolean hasDiscreteRangedMaxValue() {
+        try {
+            return isFieldValidForType(FIELD_INT_MAX_VALUE, mType);
+        } catch (BadParcelableException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the <i>discrete integer max value</i> field for this complication.
+     *
+     * <p>Valid only if the type of this complication data is {@link #TYPE_DISCRETE_RANGED_VALUE}.
+     * Otherwise returns zero.
+     */
+    public int getDiscreteRangedMaxValue() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_INT_MAX_VALUE, mType);
+        return mFields.getInt(FIELD_INT_MAX_VALUE);
+    }
+
+    /**
+     * Returns the colors for the progress bar.
+     *
+     * <p>Valid only if the type of this complication data is {@link #TYPE_RANGED_VALUE} or
+     * {@link #TYPE_GOAL_PROGRESS}.
      */
     @ColorInt
     @Nullable
-    public Integer getRangedMinColor() {
-        checkFieldValidForTypeWithoutThrowingException(FIELD_MIN_COLOR, mType);
-        if (mFields.containsKey(FIELD_MIN_COLOR)) {
-            return mFields.getInt(FIELD_MIN_COLOR);
+    public int[] getColorRamp() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_COLOR_RAMP, mType);
+        if (mFields.containsKey(FIELD_COLOR_RAMP)) {
+            return mFields.getIntArray(FIELD_COLOR_RAMP);
         }
         return null;
     }
 
     /**
-     * Returns the color the maximum ranged value should be rendered with.
+     * Returns either a boolean where: true means the color ramp colors should be smoothly
+     * interpolatded; false means the color ramp should be rendered in equal sized blocks of
+     * solid color; null means this value wasn't set, i.e. the complication is not of type
+     * {@link #TYPE_RANGED_VALUE} or {@link #TYPE_GOAL_PROGRESS}.
      *
-     * <p>Valid only if the type of this complication data is {@link #TYPE_RANGED_VALUE}.
+     * <p>Valid only if the type of this complication data is {@link #TYPE_RANGED_VALUE} or
+     * {@link #TYPE_GOAL_PROGRESS}.
      */
-    @ColorInt
     @Nullable
-    public Integer getRangedMaxColor() {
-        checkFieldValidForTypeWithoutThrowingException(FIELD_MAX_COLOR, mType);
-        if (mFields.containsKey(FIELD_MAX_COLOR)) {
-            return mFields.getInt(FIELD_MAX_COLOR);
+    public Boolean isColorRampInterpolated() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_COLOR_RAMP_INTERPOLATED, mType);
+        if (mFields.containsKey(FIELD_COLOR_RAMP_INTERPOLATED)) {
+            return mFields.getBoolean(FIELD_COLOR_RAMP_INTERPOLATED);
         }
         return null;
     }
@@ -1450,6 +1674,30 @@
     }
 
     /**
+     * Returns the element weights for this complication.
+     *
+     * <p>Valid only if the type of this complication data is {@link #TYPE_WEIGHTED_ELEMENTS}.
+     * Otherwise returns null.
+     */
+    @Nullable
+    public float[] getElementWeights() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_ELEMENT_WEIGHTS, mType);
+        return mFields.getFloatArray(FIELD_ELEMENT_WEIGHTS);
+    }
+
+    /**
+     * Returns the element colors for this complication.
+     *
+     * <p>Valid only if the type of this complication data is {@link #TYPE_WEIGHTED_ELEMENTS}.
+     * Otherwise returns null.
+     */
+    @Nullable
+    public int[] getElementColors() {
+        checkFieldValidForTypeWithoutThrowingException(FIELD_ELEMENT_COLORS, mType);
+        return mFields.getIntArray(FIELD_ELEMENT_COLORS);
+    }
+
+    /**
      * Returns the placeholder ComplicationData if there is one or `null`.
      */
     @Nullable
@@ -1671,9 +1919,13 @@
 
         /**
          * Sets the <i>value</i> field. This is required for the {@link #TYPE_RANGED_VALUE} type,
-         * and is not valid for any other type. A {@link #TYPE_RANGED_VALUE} complication
-         * visually presents a single value, which is usually a percentage. E.g. you
-         * have completed 70% of today's target of 10000 steps.
+         * and the {@link #TYPE_GOAL_PROGRESS} type. For {@link #TYPE_RANGED_VALUE} value must be
+         * in the range [min .. max] for {@link #TYPE_GOAL_PROGRESS} value must be >= 0 and may be
+         * greater than target value.
+         *
+         * <p>Both the {@link #TYPE_RANGED_VALUE} complication and the {@link #TYPE_GOAL_PROGRESS}
+         * complication visually present a single value, which is usually a percentage. E.g. you
+         * have completed 70% of today's  target of 10000 steps.
          *
          * <p>Returns this Builder to allow chaining.
          *
@@ -1718,6 +1970,73 @@
         }
 
         /**
+         * Sets the <i>discrete integer value</i> field. This is required for the
+         * {@link #TYPE_DISCRETE_RANGED_VALUE} type, and is not valid for any other type. A
+         * {@link #TYPE_DISCRETE_RANGED_VALUE} complication
+         * visually presents a single value. E.g. you have drunk 3 out of today's target of 6 cups
+         * of water.
+         *
+         * <p>Returns this Builder to allow chaining.
+         *
+         * @throws IllegalStateException if this field is not valid for the complication type
+         */
+        @NonNull
+        public Builder setDiscreteRangedValue(int value) {
+            putIntField(FIELD_INT_VALUE, value);
+            return this;
+        }
+
+        /**
+         * Sets the <i>min discrete integer value</i> field. This is required for the
+         * {@link #TYPE_DISCRETE_RANGED_VALUE} type, and is not valid for any other type. A
+         * {@link #TYPE_DISCRETE_RANGED_VALUE} complication visually presents a single value,
+         * which is usually a percentage. E.g. you have completed 70% of today's target of 10000
+         * steps.
+         *
+         * <p>Returns this Builder to allow chaining.
+         *
+         * @throws IllegalStateException if this field is not valid for the complication type
+         */
+        @NonNull
+        public Builder setDiscreteRangedMinValue(int minValue) {
+            putIntField(FIELD_INT_MIN_VALUE, minValue);
+            return this;
+        }
+
+        /**
+         * Sets the <i>max discrete integer value</i> field. This is required for the
+         * {@link #TYPE_DISCRETE_RANGED_VALUE} type, and is not valid for any other type. A
+         * {@link #TYPE_DISCRETE_RANGED_VALUE} complication visually presents a single value,
+         * which is usually a percentage. E.g. you have completed 70% of today's target of 10000
+         * steps.
+         *
+         * <p>Returns this Builder to allow chaining.
+         *
+         * @throws IllegalStateException if this field is not valid for the complication type
+         */
+        @NonNull
+        public Builder setDiscreteRangedMaxValue(int maxValue) {
+            putIntField(FIELD_INT_MAX_VALUE, maxValue);
+            return this;
+        }
+
+        /**
+         * Sets the <i>targetValue</i> field. This is required for the {@link #TYPE_GOAL_PROGRESS}
+         * type, and is not valid for any other type. A {@link #TYPE_GOAL_PROGRESS} complication
+         * visually presents a single value, which is usually a percentage. E.g. you
+         * have completed 70% of today's target of 10000 steps.
+         *
+         * <p>Returns this Builder to allow chaining.
+         *
+         * @throws IllegalStateException if this field is not valid for the complication type
+         */
+        @NonNull
+        public Builder setTargetValue(float targetValue) {
+            putFloatField(FIELD_TARGET_VALUE, targetValue);
+            return this;
+        }
+
+        /**
          * Sets the <i>long title</i> field. This is optional for the {@link #TYPE_LONG_TEXT} type,
          * and is not valid for any other type.
          *
@@ -2034,36 +2353,25 @@
         }
 
         /**
-         * Sets the type of a RangedValue's value which may be used by a renderer to influence
-         * styling.
+         * Optional. Sets the color the color ramp should be drawn with.
          *
          * <p>Returns this Builder to allow chaining.
          */
         @NonNull
-        public Builder setValueType(int valueType) {
-            putOrRemoveField(FIELD_VALUE_TYPE, valueType);
+        public Builder setColorRamp(@Nullable int[] colorRamp) {
+            putOrRemoveField(FIELD_COLOR_RAMP, colorRamp);
             return this;
         }
 
         /**
-         * Optional. Sets the color that the minimum ranged value should be rendered with.
+         * Optional. Sets whether or not the color ramp should be smootly shaded or drawn with
+         * steps.
          *
          * <p>Returns this Builder to allow chaining.
          */
         @NonNull
-        public Builder setRangedMinColor(@Nullable Integer minColor) {
-            putOrRemoveField(FIELD_MIN_COLOR, minColor);
-            return this;
-        }
-
-        /**
-         * Optional. Sets the color that the maximum ranged value should be rendered with.
-         *
-         * <p>Returns this Builder to allow chaining.
-         */
-        @NonNull
-        public Builder setRangedMaxColor(@Nullable Integer minColor) {
-            putOrRemoveField(FIELD_MAX_COLOR, minColor);
+        public Builder setColorRampIsSmoothShaded(@Nullable Boolean isSmoothShaded) {
+            putOrRemoveField(FIELD_COLOR_RAMP_INTERPOLATED, isSmoothShaded);
             return this;
         }
 
@@ -2092,6 +2400,28 @@
         }
 
         /**
+         * Sets the element weights for this complication.
+         *
+         * <p>Returns this Builder to allow chaining.
+         */
+        @NonNull
+        public Builder setElementWeights(@Nullable float[] elementWeights) {
+            putOrRemoveField(FIELD_ELEMENT_WEIGHTS, elementWeights);
+            return this;
+        }
+
+        /**
+         * Sets the element colors for this complication.
+         *
+         * <p>Returns this Builder to allow chaining.
+         */
+        @NonNull
+        public Builder setElementColors(@Nullable int[] elementColors) {
+            putOrRemoveField(FIELD_ELEMENT_COLORS, elementColors);
+            return this;
+        }
+
+        /**
          * Constructs and returns {@link ComplicationData} with the provided fields. All required
          * fields must be populated before this method is called.
          *
@@ -2159,6 +2489,10 @@
                 mFields.putString(field, (String) obj);
             } else if (obj instanceof Parcelable) {
                 mFields.putParcelable(field, (Parcelable) obj);
+            } else if (obj instanceof int[]) {
+                mFields.putIntArray(field, (int[]) obj);
+            } else if (obj instanceof float[]) {
+                mFields.putFloatArray(field, (float[]) obj);
             } else {
                 throw new IllegalArgumentException("Unexpected object type: " + obj.getClass());
             }
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
index 1e75f12..84217e3 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Data.kt
@@ -21,6 +21,7 @@
 import android.graphics.drawable.Icon
 import android.os.Build
 import androidx.annotation.ColorInt
+import androidx.annotation.FloatRange
 import androidx.annotation.IntDef
 import androidx.annotation.RestrictTo
 import androidx.wear.tiles.LayoutElementBuilders
@@ -150,6 +151,7 @@
         null
     )
 
+    @OptIn(ComplicationExperimental::class)
     val contentDescription: ComplicationText? =
         when (placeholder) {
             is ShortTextComplicationData -> placeholder.contentDescription
@@ -158,6 +160,9 @@
             is MonochromaticImageComplicationData -> placeholder.contentDescription
             is SmallImageComplicationData -> placeholder.contentDescription
             is PhotoImageComplicationData -> placeholder.contentDescription
+            is GoalProgressComplicationData -> placeholder.contentDescription
+            is DiscreteRangedValueComplicationData -> placeholder.contentDescription
+            is WeightedElementsComplicationData -> placeholder.contentDescription
             else -> null
         }
 
@@ -714,6 +719,56 @@
 }
 
 /**
+ * Describes an optional color ramp for the progress bar associated with
+ * [RangedValueComplicationData] or [GoalProgressComplicationData]. This is a rendering hint that
+ * overrides the normal watch face colors when there's a particular semantic meaning. E.g. red to
+ * blue for a ranged value representing temperature.
+ *
+ * @property colors The colors to render the progress bar with. For [RangedValueComplicationData]
+ * the first color corresponds to [RangedValueComplicationData.min] and the last color to
+ * [RangedValueComplicationData.max]. For [GoalProgressComplicationData] the first color corresponds
+ * to zero and the last color to [GoalProgressComplicationData.targetValue]. A maximum of 7 colors
+ * may be specified. When rendered the colors must be evenly spread along the progress bar.
+ * @property interpolated If `true` then the colors should be smoothly interpolated when rendering
+ * the progress bar. If `false` the colors should be rendered as equal sized regions of solid color,
+ * resulting in a noticeable step between each color.
+ */
+@ComplicationExperimental
+public class ColorRamp(
+    @ColorInt val colors: IntArray,
+    @get:JvmName("isInterpolated")
+    val interpolated: Boolean
+) {
+    init {
+        require(colors.size <= 7) {
+            "colors can have no more than seven entries"
+        }
+    }
+
+    override fun toString(): String {
+        return "ColorRamp(colors=[${colors.joinToString()}], interpolated=$interpolated)"
+    }
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as ColorRamp
+
+        if (!colors.contentEquals(other.colors)) return false
+        if (interpolated != other.interpolated) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = colors.contentHashCode()
+        result = 31 * result + interpolated.hashCode()
+        return result
+    }
+}
+
+/**
  * Type used for complications including a numerical value within a range, such as a percentage.
  * The value may be accompanied by an icon and/or short text and title.
  *
@@ -733,15 +788,15 @@
  * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
  * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
  * a light grey box.
- * @property text The body [ComplicationText] of the complication. The length of the text, including
+ * @property title The optional title [ComplicationText]. The length of the title, including
  * any time-dependent values at any valid time, is expected to not exceed seven characters. When
  * using this text, the watch face should be able to display any string of up to seven characters
  * (reducing the text size appropriately if the string is very wide). Although not expected, it is
  * possible that strings of more than seven characters might be seen, in which case they may be
- * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as a
- * placeholder rather than rendering normally, its suggested it should be rendered as a light grey
+ * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ * a placeholder rather than rendering normally, its suggested it should be rendered as a light grey
  * box.
- * @property title The optional title [ComplicationText]. The length of the text, including
+ * @property text The body [ComplicationText] of the complication. The length of the text, including
  * any time-dependent values at any valid time, is expected to not exceed seven characters. When
  * using this text, the watch face should be able to display any string of up to seven characters
  * (reducing the text size appropriately if the string is very wide). Although not expected, it is
@@ -764,7 +819,6 @@
     validTimeRange: TimeRange?,
     cachedWireComplicationData: WireComplicationData?,
     dataSource: ComponentName?,
-    @ValueType valueType: Int,
     colorRamp: ColorRamp?
 ) : ComplicationData(
     TYPE,
@@ -815,50 +869,6 @@
         }
     }
 
-    /**
-     * Optional [ValueType] which may be used by the renderer to influence styling of the ranged
-     * value.
-     */
-    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-    @get:ValueType
-    @get:ComplicationExperimental
-    @ComplicationExperimental
-    @ValueType
-    val valueType: Int = valueType
-
-    /**
-     * Describes an optional simple linear color ramp to be applied when rendering the
-     * [RangedValueComplicationData] where [min] is rendered with [minColor] and [max] with
-     * [maxColor].
-     *
-     * This is a rendering hint that would override the normal watch face colors when there's a
-     * particular semantic meaning. E.g. red to blue for a ranged value representing temperature.
-     */
-    @ComplicationExperimental
-    public class ColorRamp(@ColorInt val minColor: Int, @ColorInt val maxColor: Int) {
-        override fun toString(): String {
-            return "ColorRamp(minColor=$minColor, maxColor=$maxColor)"
-        }
-
-        override fun equals(other: Any?): Boolean {
-            if (this === other) return true
-            if (javaClass != other?.javaClass) return false
-
-            other as ColorRamp
-
-            if (minColor != other.minColor) return false
-            if (maxColor != other.maxColor) return false
-
-            return true
-        }
-
-        override fun hashCode(): Int {
-            var result = minColor
-            result = 31 * result + maxColor
-            return result
-        }
-    }
-
     /** Optional hint to render the value with the specified [ColorRamp]. */
     @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
     @get:ComplicationExperimental
@@ -868,7 +878,8 @@
     /**
      * Builder for [RangedValueComplicationData].
      *
-     * You must at a minimum set the [value], [min], [max] and [contentDescription] fields.
+     * You must at a minimum set the [value], [min], [max] and [contentDescription] fields and at
+     * least one of [monochromaticImage], [text] or [title].
      *
      * @param value The value of the ranged complication which should be in the range
      * [[min]] .. [[max]]
@@ -890,7 +901,6 @@
         private var text: ComplicationText? = null
         private var cachedWireComplicationData: WireComplicationData? = null
         private var dataSource: ComponentName? = null
-        @ValueType private var valueType = ValueType.NONE
         @OptIn(ComplicationExperimental::class)
         private var colorRamp: ColorRamp? = null
 
@@ -921,7 +931,7 @@
             this.title = title
         }
 
-        /** Sets optional title associated with the complication data. */
+        /** Sets optional text associated with the complication data. */
         public fun setText(text: ComplicationText?): Builder = apply {
             this.text = text
         }
@@ -938,15 +948,6 @@
         }
 
         /**
-         * Sets the [ValueType] that may be used by renderers to influence styling of the ranged
-         * value complication.
-         */
-        @ComplicationExperimental
-        public fun setValueType(@ValueType valueType: Int): Builder = apply {
-            this.valueType = valueType
-        }
-
-        /**
          * Sets an optional hint which suggests the renderer draws the complication using a
          * [ColorRamp].
          */
@@ -963,8 +964,11 @@
 
         /** Builds the [RangedValueComplicationData]. */
         @OptIn(ComplicationExperimental::class)
-        public fun build(): RangedValueComplicationData =
-            RangedValueComplicationData(
+        public fun build(): RangedValueComplicationData {
+            require(monochromaticImage != null || text != null || title != null) {
+                "At least one of monochromaticImage, text or title must be set"
+            }
+            return RangedValueComplicationData(
                 value,
                 min,
                 max,
@@ -976,9 +980,9 @@
                 validTimeRange,
                 cachedWireComplicationData,
                 dataSource,
-                valueType,
                 colorRamp
             )
+        }
     }
 
     /** @hide */
@@ -1009,10 +1013,9 @@
         )
         setValidTimeRange(validTimeRange, builder)
         builder.setTapActionLostDueToSerialization(tapActionLostDueToSerialization)
-        builder.setValueType(valueType)
         colorRamp?.let {
-            builder.setRangedMinColor(it.minColor)
-            builder.setRangedMaxColor(it.maxColor)
+            builder.setColorRamp(it.colors)
+            builder.setColorRampIsSmoothShaded(it.interpolated)
         }
     }
 
@@ -1034,7 +1037,6 @@
         if (tapAction != other.tapAction) return false
         if (validTimeRange != other.validTimeRange) return false
         if (dataSource != other.dataSource) return false
-        if (valueType != other.valueType) return false
         if (colorRamp != other.colorRamp) return false
 
         return true
@@ -1053,7 +1055,6 @@
         result = 31 * result + (tapAction?.hashCode() ?: 0)
         result = 31 * result + validTimeRange.hashCode()
         result = 31 * result + dataSource.hashCode()
-        result = 31 * result + valueType.hashCode()
         result = 31 * result + colorRamp.hashCode()
         return result
     }
@@ -1070,7 +1071,7 @@
             "contentDescription=$contentDescription), " +
             "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
             "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource, " +
-            "valueType=$valueType, colorRamp=$colorRamp)"
+            "colorRamp=$colorRamp)"
     }
 
     override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
@@ -1106,6 +1107,856 @@
 }
 
 /**
+ * Type used for complications which show progress towards a goal, E.g. you've done 2400 out of your
+ * daily target of 10000 steps. Unlike [RangedValueComplicationData] [value] is allowed to be larger
+ * than [targetValue] (e.g. you've done 12000 steps) and renderers may chose to acknowledge this in
+ * a special way. The value may be accompanied by an icon and/or short text and title.
+ *
+ * The [value], and [targetValue] fields are required for this type and the progress is expected to
+ * always be displayed.
+ *
+ * The icon, title, and text fields are optional and the watch face may choose which of these
+ * fields to display, if any.
+ *
+ * @property value The [Float] value of this complication which is >= 0f, this value may be larger
+ * than [targetValue]. If it's equal to [PLACEHOLDER] the renderer must treat it as a placeholder
+ * rather than rendering normally, its suggested to be drawn as a grey arc with a percentage value
+ * selected by the renderer.
+ * @property targetValue The target [Float] value for this complication.
+ * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
+ * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
+ * a light grey box.
+ * @property title The optional title [ComplicationText]. The length of the title, including
+ * any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ * using this text, the watch face should be able to display any string of up to seven characters
+ * (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ * possible that strings of more than seven characters might be seen, in which case they may be
+ * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ * a placeholder rather than rendering normally, its suggested it should be rendered as a light grey
+ * box.
+ * @property text The body [ComplicationText] of the complication. The length of the text, including
+ * any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ * using this text, the watch face should be able to display any string of up to seven characters
+ * (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ * possible that strings of more than seven characters might be seen, in which case they may be
+ * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as a
+ * placeholder rather than rendering normally, its suggested it should be rendered as a light grey
+ * box.
+ * @property contentDescription The content description field for accessibility.
+ */
+@ComplicationExperimental
+public class GoalProgressComplicationData
+internal constructor(
+    public val value: Float,
+    public val targetValue: Float,
+    public val monochromaticImage: MonochromaticImage?,
+    public val title: ComplicationText?,
+    public val text: ComplicationText?,
+    public val contentDescription: ComplicationText?,
+    tapAction: PendingIntent?,
+    validTimeRange: TimeRange?,
+    cachedWireComplicationData: WireComplicationData?,
+    dataSource: ComponentName?,
+    colorRamp: ColorRamp?
+) : ComplicationData(
+    TYPE,
+    tapAction = tapAction,
+    cachedWireComplicationData = cachedWireComplicationData,
+    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+    dataSource = dataSource
+) {
+    /** Optional hint to render the value with the specified [ColorRamp]. */
+    @Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
+    @get:ComplicationExperimental
+    @ComplicationExperimental
+    val colorRamp: ColorRamp? = colorRamp
+
+    /**
+     * Builder for [GoalProgressComplicationData].
+     *
+     * You must at a minimum set the [value], [targetValue] and [contentDescription] fields and at
+     * least one of [monochromaticImage], [text] or [title].
+     *
+     * @param value The value of the ranged complication which should be >= 0.
+     * @param targetValue The target value. This must be less than [Float.MAX_VALUE].
+     * @param contentDescription Localized description for use by screen readers
+     */
+    @OptIn(ComplicationExperimental::class)
+    public class Builder(
+        private val value: Float,
+        private val targetValue: Float,
+        private var contentDescription: ComplicationText
+    ) {
+        private var tapAction: PendingIntent? = null
+        private var validTimeRange: TimeRange? = null
+        private var monochromaticImage: MonochromaticImage? = null
+        private var title: ComplicationText? = null
+        private var text: ComplicationText? = null
+        private var cachedWireComplicationData: WireComplicationData? = null
+        private var dataSource: ComponentName? = null
+        @OptIn(ComplicationExperimental::class)
+        private var colorRamp: ColorRamp? = null
+
+        init {
+            require(targetValue != Float.MAX_VALUE) {
+                "Float.MAX_VALUE is reserved and can't be used for target"
+            }
+        }
+
+        /** Sets optional pending intent to be invoked when the complication is tapped. */
+        public fun setTapAction(tapAction: PendingIntent?): Builder = apply {
+            this.tapAction = tapAction
+        }
+
+        /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
+        public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
+            this.validTimeRange = validTimeRange
+        }
+
+        /** Sets optional icon associated with the complication data. */
+        public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
+            this.monochromaticImage = monochromaticImage
+        }
+
+        /** Sets optional title associated with the complication data. */
+        public fun setTitle(title: ComplicationText?): Builder = apply {
+            this.title = title
+        }
+
+        /** Sets optional text associated with the complication data. */
+        public fun setText(text: ComplicationText?): Builder = apply {
+            this.text = text
+        }
+
+        /**
+         * Sets the [ComponentName] of the ComplicationDataSourceService that provided this
+         * ComplicationData, if any.
+         *
+         * Note a ComplicationDataSourceService does not need to call this because the system will
+         * set this value on its behalf.
+         */
+        public fun setDataSource(dataSource: ComponentName?): Builder = apply {
+            this.dataSource = dataSource
+        }
+
+        /**
+         * Sets an optional hint which suggests the renderer draws the complication using a
+         * [ColorRamp].
+         */
+        @ComplicationExperimental
+        public fun setColorRamp(colorRamp: ColorRamp?): Builder = apply {
+            this.colorRamp = colorRamp
+        }
+
+        internal fun setCachedWireComplicationData(
+            cachedWireComplicationData: WireComplicationData?
+        ): Builder = apply {
+            this.cachedWireComplicationData = cachedWireComplicationData
+        }
+
+        /** Builds the [GoalProgressComplicationData]. */
+        @OptIn(ComplicationExperimental::class)
+        public fun build(): GoalProgressComplicationData {
+            require(monochromaticImage != null || text != null || title != null) {
+                "At least one of monochromaticImage, text or title must be set"
+            }
+            return GoalProgressComplicationData(
+                value,
+                targetValue,
+                monochromaticImage,
+                title,
+                text,
+                contentDescription,
+                tapAction,
+                validTimeRange,
+                cachedWireComplicationData,
+                dataSource,
+                colorRamp
+            )
+        }
+    }
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public override fun asWireComplicationData(): WireComplicationData {
+        cachedWireComplicationData?.let {
+            return it
+        }
+        return createWireComplicationDataBuilder().apply {
+            fillWireComplicationDataBuilder(this)
+        }.build().also { cachedWireComplicationData = it }
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun fillWireComplicationDataBuilder(builder: WireComplicationDataBuilder) {
+        builder.setRangedValue(value)
+        builder.setTargetValue(targetValue)
+        monochromaticImage?.addToWireComplicationData(builder)
+        builder.setShortText(text?.toWireComplicationText())
+        builder.setShortTitle(title?.toWireComplicationText())
+        builder.setTapAction(tapAction)
+        builder.setContentDescription(
+            when (contentDescription) {
+                ComplicationText.EMPTY -> null
+                else -> contentDescription?.toWireComplicationText()
+            }
+        )
+        setValidTimeRange(validTimeRange, builder)
+        builder.setTapActionLostDueToSerialization(tapActionLostDueToSerialization)
+        colorRamp?.let {
+            builder.setColorRamp(it.colors)
+            builder.setColorRampIsSmoothShaded(it.interpolated)
+        }
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as GoalProgressComplicationData
+
+        if (value != other.value) return false
+        if (targetValue != other.targetValue) return false
+        if (monochromaticImage != other.monochromaticImage) return false
+        if (title != other.title) return false
+        if (text != other.text) return false
+        if (contentDescription != other.contentDescription) return false
+        if (tapActionLostDueToSerialization != other.tapActionLostDueToSerialization) return false
+        if (tapAction != other.tapAction) return false
+        if (validTimeRange != other.validTimeRange) return false
+        if (dataSource != other.dataSource) return false
+        if (colorRamp != other.colorRamp) return false
+
+        return true
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun hashCode(): Int {
+        var result = value.hashCode()
+        result = 31 * result + targetValue.hashCode()
+        result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (title?.hashCode() ?: 0)
+        result = 31 * result + (text?.hashCode() ?: 0)
+        result = 31 * result + (contentDescription?.hashCode() ?: 0)
+        result = 31 * result + tapActionLostDueToSerialization.hashCode()
+        result = 31 * result + (tapAction?.hashCode() ?: 0)
+        result = 31 * result + validTimeRange.hashCode()
+        result = 31 * result + dataSource.hashCode()
+        result = 31 * result + colorRamp.hashCode()
+        return result
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun toString(): String {
+        val valueString = if (WireComplicationData.shouldRedact()) {
+            "REDACTED"
+        } else {
+            value.toString()
+        }
+        return "GoalProgressComplicationData(value=$valueString, targetValue=$targetValue, " +
+            "monochromaticImage=$monochromaticImage, title=$title, text=$text, " +
+            "contentDescription=$contentDescription), " +
+            "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
+            "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource, " +
+            "colorRamp=$colorRamp)"
+    }
+
+    override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
+        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true
+
+    override fun getNextChangeInstant(afterInstant: Instant): Instant {
+        val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
+        val textChangeInstant = text?.getNextChangeTime(afterInstant) ?: Instant.MAX
+        return if (textChangeInstant.isBefore(titleChangeInstant)) {
+            textChangeInstant
+        } else {
+            titleChangeInstant
+        }
+    }
+
+    /** @hide */
+    public companion object {
+        /** The [ComplicationType] corresponding to objects of this type. */
+        @OptIn(ComplicationExperimental::class)
+        @JvmField
+        public val TYPE: ComplicationType = ComplicationType.GOAL_PROGRESS
+
+        /**
+         * Used to signal the range should be rendered as a placeholder. It's suggested that a
+         * placeholder ranged value be drawn as a grey arc with a percentage value selected by the
+         * renderer.
+         *
+         * Note a placeholder may only be used in the context of
+         * [NoDataComplicationData.placeholder].
+         */
+        @JvmField
+        public val PLACEHOLDER = Float.MAX_VALUE
+    }
+}
+
+/**
+ * Type used for complications which want to display the breakdown of something (e.g. nutrition
+ * data) perhaps as a pie chart, or as a stacked bar chart etc. The breakdown may be accompanied by
+ * an icon and/or short text and title.
+ *
+ * The [elements] field is required for this type and is expected to always be displayed.
+ *
+ * The icon, title, and text fields are optional but at least one of them must be set. The watch
+ * face may choose which of these fields to display, if any.
+ *
+ * @property elements The breakdown of the subject into various [Element]s. E.g. the proportion of
+ * calories consumed which were carbohydrates, fats etc... If this is equal to [PLACEHOLDER] then
+ * the renderer must display this in a visiually distinct way to suggest to the user that it's
+ * placeholder data.  E.g. each rendered is rendered in light grey.
+ * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
+ * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
+ * a light grey box.
+ * @property title The optional title [ComplicationText]. The length of the title, including
+ * any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ * using this text, the watch face should be able to display any string of up to seven characters
+ * (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ * possible that strings of more than seven characters might be seen, in which case they may be
+ * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ * a placeholder rather than rendering normally, its suggested it should be rendered as a light grey
+ * box.
+ * @property text The body [ComplicationText] of the complication. The length of the text, including
+ * any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ * using this text, the watch face should be able to display any string of up to seven characters
+ * (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ * possible that strings of more than seven characters might be seen, in which case they may be
+ * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as a
+ * placeholder rather than rendering normally, its suggested it should be rendered as a light grey
+ * box.
+ * @property contentDescription The content description field for accessibility.
+ */
+@ComplicationExperimental
+public class WeightedElementsComplicationData
+internal constructor(
+    public val elements: List<Element>,
+    public val monochromaticImage: MonochromaticImage?,
+    public val title: ComplicationText?,
+    public val text: ComplicationText?,
+    public val contentDescription: ComplicationText?,
+    tapAction: PendingIntent?,
+    validTimeRange: TimeRange?,
+    cachedWireComplicationData: WireComplicationData?,
+    dataSource: ComponentName?
+) : ComplicationData(
+    TYPE,
+    tapAction = tapAction,
+    cachedWireComplicationData = cachedWireComplicationData,
+    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+    dataSource = dataSource
+) {
+    /**
+     * Describes a single value within a [WeightedElementsComplicationData].
+     *
+     * @property weight The weight of the Element which must be > zero. The size of the element when
+     * rendered should be proportional to its weight. Weights are not required to sum to any
+     * particular value.
+     * @property color The color of the Element. In conjunction with the other fields this color
+     * needs to be meaningful to the user. Tapping on the complication should launch an experience
+     * where the data is presented in more detail. Care must be taken to ensure the colors used are
+     * consistent.
+     */
+    class Element(
+        @FloatRange(from = 0.0, fromInclusive = false) val weight: Float,
+        @ColorInt val color: Int
+    ) {
+        init {
+            require(weight > 0) { "The weight must be > 0" }
+        }
+
+        override fun equals(other: Any?): Boolean {
+            if (this === other) return true
+            if (javaClass != other?.javaClass) return false
+
+            other as Element
+
+            if (color != other.color) return false
+            if (weight != other.weight) return false
+
+            return true
+        }
+
+        override fun hashCode(): Int {
+            var result = color
+            result = 31 * result + weight.hashCode()
+            return result
+        }
+
+        override fun toString(): String {
+            return "Element(color=$color, weight=$weight)"
+        }
+    }
+
+    /**
+     * Builder for [WeightedElementsComplicationData].
+     *
+     * You must at a minimum set the [elements] field and at least one of [monochromaticImage],
+     * [text] or [title].
+     *
+     * @param elements The breakdown of the subject into various [Element]s. E.g. the proportion of
+     * calories consumed which were carbohydrates, fats etc... The [tapAction] must take the user to
+     * an experience where the color key becomes obvious.
+     * @param contentDescription Localized description for use by screen readers
+     */
+    @OptIn(ComplicationExperimental::class)
+    public class Builder(
+        private val elements: List<Element>,
+        private var contentDescription: ComplicationText
+    ) {
+        private var tapAction: PendingIntent? = null
+        private var validTimeRange: TimeRange? = null
+        private var monochromaticImage: MonochromaticImage? = null
+        private var title: ComplicationText? = null
+        private var text: ComplicationText? = null
+        private var cachedWireComplicationData: WireComplicationData? = null
+        private var dataSource: ComponentName? = null
+
+        /** Sets optional pending intent to be invoked when the complication is tapped. */
+        public fun setTapAction(tapAction: PendingIntent?): Builder = apply {
+            this.tapAction = tapAction
+        }
+
+        /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
+        public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
+            this.validTimeRange = validTimeRange
+        }
+
+        /** Sets optional icon associated with the complication data. */
+        public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
+            this.monochromaticImage = monochromaticImage
+        }
+
+        /** Sets optional title associated with the complication data. */
+        public fun setTitle(title: ComplicationText?): Builder = apply {
+            this.title = title
+        }
+
+        /** Sets optional text associated with the complication data. */
+        public fun setText(text: ComplicationText?): Builder = apply {
+            this.text = text
+        }
+
+        /**
+         * Sets the [ComponentName] of the ComplicationDataSourceService that provided this
+         * ComplicationData, if any.
+         *
+         * Note a ComplicationDataSourceService does not need to call this because the system will
+         * set this value on its behalf.
+         */
+        public fun setDataSource(dataSource: ComponentName?): Builder = apply {
+            this.dataSource = dataSource
+        }
+
+        internal fun setCachedWireComplicationData(
+            cachedWireComplicationData: WireComplicationData?
+        ): Builder = apply {
+            this.cachedWireComplicationData = cachedWireComplicationData
+        }
+
+        /** Builds the [GoalProgressComplicationData]. */
+        @OptIn(ComplicationExperimental::class)
+        public fun build(): WeightedElementsComplicationData {
+            require(monochromaticImage != null || text != null || title != null) {
+                "At least one of monochromaticImage, text or title must be set"
+            }
+            return WeightedElementsComplicationData(
+                elements,
+                monochromaticImage,
+                title,
+                text,
+                contentDescription,
+                tapAction,
+                validTimeRange,
+                cachedWireComplicationData,
+                dataSource
+            )
+        }
+    }
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public override fun asWireComplicationData(): WireComplicationData {
+        cachedWireComplicationData?.let {
+            return it
+        }
+        return createWireComplicationDataBuilder().apply {
+            fillWireComplicationDataBuilder(this)
+        }.build().also { cachedWireComplicationData = it }
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun fillWireComplicationDataBuilder(builder: WireComplicationDataBuilder) {
+        builder.setElementWeights(elements.map { it.weight }.toFloatArray())
+        builder.setElementColors(elements.map { it.color }.toIntArray())
+        monochromaticImage?.addToWireComplicationData(builder)
+        builder.setShortText(text?.toWireComplicationText())
+        builder.setShortTitle(title?.toWireComplicationText())
+        builder.setTapAction(tapAction)
+        builder.setContentDescription(
+            when (contentDescription) {
+                ComplicationText.EMPTY -> null
+                else -> contentDescription?.toWireComplicationText()
+            }
+        )
+        setValidTimeRange(validTimeRange, builder)
+        builder.setTapActionLostDueToSerialization(tapActionLostDueToSerialization)
+    }
+
+    override fun getNextChangeInstant(afterInstant: Instant): Instant {
+        val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
+        val textChangeInstant = text?.getNextChangeTime(afterInstant) ?: Instant.MAX
+        return if (textChangeInstant.isBefore(titleChangeInstant)) {
+            textChangeInstant
+        } else {
+            titleChangeInstant
+        }
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun toString(): String {
+        val elementsString = if (WireComplicationData.shouldRedact()) {
+            "REDACTED"
+        } else {
+            elements.joinToString()
+        }
+        return "WeightedElementsComplicationData(elements=$elementsString, " +
+            "monochromaticImage=$monochromaticImage, title=$title, text=$text, " +
+            "contentDescription=$contentDescription), " +
+            "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
+            "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource)"
+    }
+
+    override fun hasPlaceholderFields() = elements == PLACEHOLDER ||
+        text?.isPlaceholder() == true || title?.isPlaceholder() == true ||
+        monochromaticImage?.isPlaceholder() == true
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as WeightedElementsComplicationData
+
+        if (elements != other.elements) return false
+        if (monochromaticImage != other.monochromaticImage) return false
+        if (title != other.title) return false
+        if (text != other.text) return false
+        if (contentDescription != other.contentDescription) return false
+
+        return true
+    }
+
+    override fun hashCode(): Int {
+        var result = elements.hashCode()
+        result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (title?.hashCode() ?: 0)
+        result = 31 * result + (text?.hashCode() ?: 0)
+        result = 31 * result + (contentDescription?.hashCode() ?: 0)
+        return result
+    }
+
+    /** @hide */
+    public companion object {
+        /** The [ComplicationType] corresponding to objects of this type. */
+        @OptIn(ComplicationExperimental::class)
+        @JvmField
+        public val TYPE: ComplicationType = ComplicationType.WEIGHTED_ELEMENTS
+
+        /**
+         * Used to signal the range should be rendered as a placeholder. It's suggested that a
+         * placeholder ranged value be drawn as a grey arc with a percentage value selected by the
+         * renderer.
+         *
+         * Note a placeholder may only be used in the context of
+         * [NoDataComplicationData.placeholder].
+         */
+        @JvmField
+        public val PLACEHOLDER = emptyList<Element>()
+    }
+}
+
+/**
+ * Type used for complications including a discrete integer value within a range. E.g. 3 out of 6
+ * daily cups of water drunk. The value may be accompanied by an icon and/or short text and title.
+ *
+ * The [value], [min], and [max] fields are required for this type and the value within the
+ * range is expected to always be displayed.
+ *
+ * The icon, title, and text fields are optional and the watch face may choose which of these
+ * fields to display, if any.
+ *
+ * Unlike [RangedValueComplicationData], DiscreteRangedValueComplicationData doesn't specify a color
+ * ramp, this is because the ranged value is expected to be rendered using solid colored segments
+ * with watch face selected colors.
+ *
+ * @property value The [Int] value of this complication which is >= [min] and <= [max] or equal to
+ * [PLACEHOLDER]. If it's equal to [PLACEHOLDER] the renderer must treat it as a placeholder rather
+ * than rendering normally, its suggested to be drawn as a grey arc with a percentage value selected
+ * by the renderer.
+ * @property min The minimum [Int] value for this complication.
+ * @property max The maximum [Int] value for this complication.
+ * @property monochromaticImage A simple [MonochromaticImage] image that can be tinted by the watch
+ * face. If the monochromaticImage is equal to [MonochromaticImage.PLACEHOLDER] the renderer must
+ * treat it as a placeholder rather than rendering normally, its suggested it should be rendered as
+ * a light grey box.
+ * @property title The optional title [ComplicationText]. The length of the title, including
+ * any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ * using this text, the watch face should be able to display any string of up to seven characters
+ * (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ * possible that strings of more than seven characters might be seen, in which case they may be
+ * truncated. If the title is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as
+ * a placeholder rather than rendering normally, its suggested it should be rendered as a light grey
+ * box.
+ * @property text The body [ComplicationText] of the complication. The length of the text, including
+ * any time-dependent values at any valid time, is expected to not exceed seven characters. When
+ * using this text, the watch face should be able to display any string of up to seven characters
+ * (reducing the text size appropriately if the string is very wide). Although not expected, it is
+ * possible that strings of more than seven characters might be seen, in which case they may be
+ * truncated. If the text is equal to [ComplicationText.PLACEHOLDER] the renderer must treat it as a
+ * placeholder rather than rendering normally, its suggested it should be rendered as a light grey
+ * box.
+ * @property contentDescription The content description field for accessibility.
+ */
+@ComplicationExperimental
+public class DiscreteRangedValueComplicationData
+internal constructor(
+    public val value: Int,
+    public val min: Int,
+    public val max: Int,
+    public val monochromaticImage: MonochromaticImage?,
+    public val title: ComplicationText?,
+    public val text: ComplicationText?,
+    public val contentDescription: ComplicationText?,
+    tapAction: PendingIntent?,
+    validTimeRange: TimeRange?,
+    cachedWireComplicationData: WireComplicationData?,
+    dataSource: ComponentName?,
+) : ComplicationData(
+    TYPE,
+    tapAction = tapAction,
+    cachedWireComplicationData = cachedWireComplicationData,
+    validTimeRange = validTimeRange ?: TimeRange.ALWAYS,
+    dataSource = dataSource
+) {
+    /**
+     * Builder for [DiscreteRangedValueComplicationData].
+     *
+     * You must at a minimum set the [value], [min], [max] and [contentDescription] fields and at
+     * least one of [monochromaticImage], [text] or [title].
+     *
+     * @param value The value of the ranged complication which should be in the range
+     * [[min]] .. [[max]]
+     * @param min The minimum value
+     * @param max The maximum value. This must be less than [Float.MAX_VALUE].
+     * @param contentDescription Localized description for use by screen readers
+     */
+    @OptIn(ComplicationExperimental::class)
+    public class Builder(
+        private val value: Int,
+        private val min: Int,
+        private val max: Int,
+        private var contentDescription: ComplicationText
+    ) {
+        private var tapAction: PendingIntent? = null
+        private var validTimeRange: TimeRange? = null
+        private var monochromaticImage: MonochromaticImage? = null
+        private var title: ComplicationText? = null
+        private var text: ComplicationText? = null
+        private var cachedWireComplicationData: WireComplicationData? = null
+        private var dataSource: ComponentName? = null
+
+        init {
+            require(max != Int.MAX_VALUE) {
+                "Int.MAX_VALUE is reserved and can't be used for max"
+            }
+        }
+
+        /** Sets optional pending intent to be invoked when the complication is tapped. */
+        public fun setTapAction(tapAction: PendingIntent?): Builder = apply {
+            this.tapAction = tapAction
+        }
+
+        /** Sets optional time range during which the complication has to be shown. */
+        @Suppress("MissingGetterMatchingBuilder") // b/174052810
+        public fun setValidTimeRange(validTimeRange: TimeRange?): Builder = apply {
+            this.validTimeRange = validTimeRange
+        }
+
+        /** Sets optional icon associated with the complication data. */
+        public fun setMonochromaticImage(monochromaticImage: MonochromaticImage?): Builder = apply {
+            this.monochromaticImage = monochromaticImage
+        }
+
+        /** Sets optional title associated with the complication data. */
+        public fun setTitle(title: ComplicationText?): Builder = apply {
+            this.title = title
+        }
+
+        /** Sets optional text associated with the complication data. */
+        public fun setText(text: ComplicationText?): Builder = apply {
+            this.text = text
+        }
+
+        /**
+         * Sets the [ComponentName] of the ComplicationDataSourceService that provided this
+         * ComplicationData, if any.
+         *
+         * Note a ComplicationDataSourceService does not need to call this because the system will
+         * set this value on its behalf.
+         */
+        public fun setDataSource(dataSource: ComponentName?): Builder = apply {
+            this.dataSource = dataSource
+        }
+
+        internal fun setCachedWireComplicationData(
+            cachedWireComplicationData: WireComplicationData?
+        ): Builder = apply {
+            this.cachedWireComplicationData = cachedWireComplicationData
+        }
+
+        /** Builds the [DiscreteRangedValueComplicationData]. */
+        @OptIn(ComplicationExperimental::class)
+        public fun build(): DiscreteRangedValueComplicationData {
+            require(monochromaticImage != null || text != null || title != null) {
+                "At least one of monochromaticImage, text or title must be set"
+            }
+            return DiscreteRangedValueComplicationData(
+                value,
+                min,
+                max,
+                monochromaticImage,
+                title,
+                text,
+                contentDescription,
+                tapAction,
+                validTimeRange,
+                cachedWireComplicationData,
+                dataSource
+            )
+        }
+    }
+
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    public override fun asWireComplicationData(): WireComplicationData {
+        cachedWireComplicationData?.let {
+            return it
+        }
+        return createWireComplicationDataBuilder().apply {
+            fillWireComplicationDataBuilder(this)
+        }.build().also { cachedWireComplicationData = it }
+    }
+
+    override fun fillWireComplicationDataBuilder(builder: WireComplicationDataBuilder) {
+        builder.setDiscreteRangedValue(value)
+        builder.setDiscreteRangedMinValue(min)
+        builder.setDiscreteRangedMaxValue(max)
+        monochromaticImage?.addToWireComplicationData(builder)
+        builder.setShortText(text?.toWireComplicationText())
+        builder.setShortTitle(title?.toWireComplicationText())
+        builder.setTapAction(tapAction)
+        builder.setContentDescription(
+            when (contentDescription) {
+                ComplicationText.EMPTY -> null
+                else -> contentDescription?.toWireComplicationText()
+            }
+        )
+        setValidTimeRange(validTimeRange, builder)
+        builder.setTapActionLostDueToSerialization(tapActionLostDueToSerialization)
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (javaClass != other?.javaClass) return false
+
+        other as DiscreteRangedValueComplicationData
+
+        if (value != other.value) return false
+        if (min != other.min) return false
+        if (max != other.max) return false
+        if (monochromaticImage != other.monochromaticImage) return false
+        if (title != other.title) return false
+        if (text != other.text) return false
+        if (contentDescription != other.contentDescription) return false
+        if (tapActionLostDueToSerialization != other.tapActionLostDueToSerialization) return false
+        if (tapAction != other.tapAction) return false
+        if (validTimeRange != other.validTimeRange) return false
+        if (dataSource != other.dataSource) return false
+
+        return true
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    override fun hashCode(): Int {
+        var result = value.hashCode()
+        result = 31 * result + min.hashCode()
+        result = 31 * result + max.hashCode()
+        result = 31 * result + (monochromaticImage?.hashCode() ?: 0)
+        result = 31 * result + (title?.hashCode() ?: 0)
+        result = 31 * result + (text?.hashCode() ?: 0)
+        result = 31 * result + (contentDescription?.hashCode() ?: 0)
+        result = 31 * result + tapActionLostDueToSerialization.hashCode()
+        result = 31 * result + (tapAction?.hashCode() ?: 0)
+        result = 31 * result + validTimeRange.hashCode()
+        result = 31 * result + dataSource.hashCode()
+        return result
+    }
+
+    override fun toString(): String {
+        val valueString = if (WireComplicationData.shouldRedact()) {
+            "REDACTED"
+        } else {
+            value.toString()
+        }
+        return "DiscreteRangedValueComplicationData(value=$valueString, min=$min, max=$max, " +
+            "monochromaticImage=$monochromaticImage, title=$title, text=$text, " +
+            "contentDescription=$contentDescription), " +
+            "tapActionLostDueToSerialization=$tapActionLostDueToSerialization, " +
+            "tapAction=$tapAction, validTimeRange=$validTimeRange, dataSource=$dataSource)"
+    }
+
+    override fun hasPlaceholderFields() = value == PLACEHOLDER || text?.isPlaceholder() == true ||
+        title?.isPlaceholder() == true || monochromaticImage?.isPlaceholder() == true
+
+    override fun getNextChangeInstant(afterInstant: Instant): Instant {
+        val titleChangeInstant = title?.getNextChangeTime(afterInstant) ?: Instant.MAX
+        val textChangeInstant = text?.getNextChangeTime(afterInstant) ?: Instant.MAX
+        return if (textChangeInstant.isBefore(titleChangeInstant)) {
+            textChangeInstant
+        } else {
+            titleChangeInstant
+        }
+    }
+
+    /** @hide */
+    public companion object {
+        /** The [ComplicationType] corresponding to objects of this type. */
+        @OptIn(ComplicationExperimental::class)
+        @JvmField
+        public val TYPE: ComplicationType = ComplicationType.DISCRETE_RANGED_VALUE
+
+        /**
+         * Used to signal the range should be rendered as a placeholder. It's suggested that a
+         * placeholder ranged value be drawn as a grey arc with a percentage value selected by the
+         * renderer.
+         *
+         * Note a placeholder may only be used in the context of
+         * [NoDataComplicationData.placeholder].
+         */
+        @JvmField
+        public val PLACEHOLDER = Int.MAX_VALUE
+    }
+}
+
+/**
  * Type used for complications which consist only of a [MonochromaticImage].
  *
  * The image is expected to always be displayed.
@@ -2215,9 +3066,8 @@
             setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
             setText(shortText?.toApiComplicationTextPlaceholderAware())
             setDataSource(dataSource)
-            setValueType(valueType)
-            rangedMinColor?.let {
-                setColorRamp(RangedValueComplicationData.ColorRamp(it, rangedMaxColor!!))
+            colorRamp?.let {
+                setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
             }
         }.build()
 
@@ -2278,6 +3128,63 @@
                 setDataSource(dataSource)
             }
             .build()
+
+    GoalProgressComplicationData.TYPE.toWireComplicationType() ->
+        GoalProgressComplicationData.Builder(
+            value = rangedValue,
+            targetValue = targetValue,
+            contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+        ).apply {
+            setTapAction(tapAction)
+            setValidTimeRange(parseTimeRange())
+            setMonochromaticImage(parseIconPlaceholderAware())
+            setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
+            setText(shortText?.toApiComplicationTextPlaceholderAware())
+            setDataSource(dataSource)
+            colorRamp?.let {
+                setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
+            }
+        }.build()
+
+    DiscreteRangedValueComplicationData.TYPE.toWireComplicationType() ->
+        DiscreteRangedValueComplicationData.Builder(
+            value = discreteRangedValue,
+            min = discreteRangedMinValue,
+            max = discreteRangedMaxValue,
+            contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+        ).apply {
+            setTapAction(tapAction)
+            setValidTimeRange(parseTimeRange())
+            setMonochromaticImage(parseIconPlaceholderAware())
+            setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
+            setText(shortText?.toApiComplicationTextPlaceholderAware())
+            setDataSource(dataSource)
+        }.build()
+
+    WeightedElementsComplicationData.TYPE.toWireComplicationType() ->
+        WeightedElementsComplicationData.Builder(
+            elements = if (elementWeights!!.isEmpty()) {
+                WeightedElementsComplicationData.PLACEHOLDER
+            } else {
+                val elementWeights = this.elementWeights!!
+                val elementColors = this.elementColors!!
+                require(elementWeights.size == elementColors.size) {
+                    "elementWeights and elementColors must have the same size"
+                }
+                elementWeights.mapIndexed { index, weight ->
+                    WeightedElementsComplicationData.Element(weight, elementColors[index])
+                }.toList()
+            },
+            contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+        ).apply {
+            setTapAction(tapAction)
+            setValidTimeRange(parseTimeRange())
+            setMonochromaticImage(parseIconPlaceholderAware())
+            setTitle(shortTitle?.toApiComplicationTextPlaceholderAware())
+            setText(shortText?.toApiComplicationTextPlaceholderAware())
+            setDataSource(dataSource)
+        }.build()
+
     else -> null
 }
 
@@ -2341,9 +3248,8 @@
                 setText(shortText?.toApiComplicationText())
                 setCachedWireComplicationData(wireComplicationData)
                 setDataSource(dataSource)
-                setValueType(valueType)
-                rangedMinColor?.let {
-                    setColorRamp(RangedValueComplicationData.ColorRamp(it, rangedMaxColor!!))
+                colorRamp?.let {
+                    setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
                 }
             }.build()
 
@@ -2418,6 +3324,64 @@
                 setDataSource(dataSource)
             }.build()
 
+        GoalProgressComplicationData.TYPE.toWireComplicationType() ->
+            GoalProgressComplicationData.Builder(
+                value = rangedValue,
+                targetValue = targetValue,
+                contentDescription = contentDescription?.toApiComplicationText()
+                    ?: ComplicationText.EMPTY
+            ).apply {
+                setTapAction(tapAction)
+                setValidTimeRange(parseTimeRange())
+                setMonochromaticImage(parseIcon())
+                setTitle(shortTitle?.toApiComplicationText())
+                setText(shortText?.toApiComplicationText())
+                setCachedWireComplicationData(wireComplicationData)
+                setDataSource(dataSource)
+                colorRamp?.let {
+                    setColorRamp(ColorRamp(it, isColorRampInterpolated!!))
+                }
+            }.build()
+
+        DiscreteRangedValueComplicationData.TYPE.toWireComplicationType() ->
+            DiscreteRangedValueComplicationData.Builder(
+                value = discreteRangedValue,
+                min = discreteRangedMinValue,
+                max = discreteRangedMaxValue,
+                contentDescription = contentDescription?.toApiComplicationText()
+                    ?: ComplicationText.EMPTY
+            ).apply {
+                setTapAction(tapAction)
+                setValidTimeRange(parseTimeRange())
+                setMonochromaticImage(parseIcon())
+                setTitle(shortTitle?.toApiComplicationText())
+                setText(shortText?.toApiComplicationText())
+                setCachedWireComplicationData(wireComplicationData)
+                setDataSource(dataSource)
+            }.build()
+
+        WeightedElementsComplicationData.TYPE.toWireComplicationType() -> {
+            val elementWeights = this.elementWeights!!
+            val elementColors = this.elementColors!!
+            require(elementWeights.size == elementColors.size) {
+                "elementWeights and elementColors must have the same size"
+            }
+            WeightedElementsComplicationData.Builder(
+                elements = elementWeights.mapIndexed { index, weight ->
+                    WeightedElementsComplicationData.Element(weight, elementColors[index])
+                }.toList(),
+                contentDescription?.toApiComplicationText() ?: ComplicationText.EMPTY
+            ).apply {
+                setTapAction(tapAction)
+                setValidTimeRange(parseTimeRange())
+                setMonochromaticImage(parseIcon())
+                setTitle(shortTitle?.toApiComplicationText())
+                setText(shortText?.toApiComplicationText())
+                setCachedWireComplicationData(wireComplicationData)
+                setDataSource(dataSource)
+            }.build()
+        }
+
         else -> NoDataComplicationData()
     }
 }
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt
index f40a21a..263c5bc 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Type.kt
@@ -39,6 +39,12 @@
 
     @ComplicationExperimental
     PROTO_LAYOUT(WireComplicationData.TYPE_PROTO_LAYOUT),
+    @ComplicationExperimental
+    GOAL_PROGRESS(WireComplicationData.TYPE_GOAL_PROGRESS),
+    @ComplicationExperimental
+    DISCRETE_RANGED_VALUE(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE),
+    @ComplicationExperimental
+    WEIGHTED_ELEMENTS(WireComplicationData.TYPE_WEIGHTED_ELEMENTS),
 
     @ComplicationExperimental
     LIST(WireComplicationData.TYPE_LIST);
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
index 92a6cbb..14731de 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
@@ -226,7 +226,6 @@
         )
             .setTitle("battery".complicationText)
             .setDataSource(dataSourceA)
-            .setValueType(RangedValueComplicationData.ValueType.PROGRESS)
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
@@ -237,7 +236,6 @@
                     .setShortTitle(WireComplicationText.plainText("battery"))
                     .setContentDescription(WireComplicationText.plainText("content description"))
                     .setDataSource(dataSourceA)
-                    .setValueType(RangedValueComplicationData.ValueType.PROGRESS)
                     .build()
             )
         testRoundTripConversions(data)
@@ -256,7 +254,6 @@
         )
             .setTitle("battery".complicationText)
             .setDataSource(dataSourceA)
-            .setValueType(RangedValueComplicationData.ValueType.PROGRESS)
             .build()
 
         val data3 = RangedValueComplicationData.Builder(
@@ -265,7 +262,6 @@
         )
             .setTitle("battery2".complicationText)
             .setDataSource(dataSourceB)
-            .setValueType(RangedValueComplicationData.ValueType.SCORE)
             .build()
 
         assertThat(data).isEqualTo(data2)
@@ -280,7 +276,136 @@
                 "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
                 "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
                 "+1000000000-12-31T23:59:59.999999999Z), dataSource=" +
-                "ComponentInfo{com.pkg_a/com.a}, valueType=2, colorRamp=null)"
+                "ComponentInfo{com.pkg_a/com.a}, colorRamp=null)"
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun goalProgressComplicationData_with_ColorRamp() {
+        val data = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setDataSource(dataSourceA)
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_GOAL_PROGRESS)
+                    .setRangedValue(1200f)
+                    .setTargetValue(10000f)
+                    .setShortTitle(WireComplicationText.plainText("steps"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                    .setColorRampIsSmoothShaded(true)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as GoalProgressComplicationData
+        assertThat(deserialized.value).isEqualTo(1200f)
+        assertThat(deserialized.targetValue).isEqualTo(10000f)
+        assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("content description")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("steps")
+
+        val data2 = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setDataSource(dataSourceA)
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+            .build()
+
+        val data3 = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setDataSource(dataSourceB)
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "GoalProgressComplicationData(value=1200.0, targetValue=10000.0, " +
+                "monochromaticImage=null, title=ComplicationText{mSurroundingText=steps, " +
+                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText" +
+                "{mSurroundingText=content description, mTimeDependentText=null}), " +
+                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
+                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                "+1000000000-12-31T23:59:59.999999999Z), dataSource=" +
+                "ComponentInfo{com.pkg_a/com.a}, colorRamp=ColorRamp(colors=[-65536, -16711936, " +
+                "-16776961], interpolated=true))"
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun discreteRangedValueComplicationData() {
+        val data = DiscreteRangedValueComplicationData.Builder(
+            value = 95, min = 0, max = 100,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("battery".complicationText)
+            .setDataSource(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE)
+                    .setDiscreteRangedValue(95)
+                    .setDiscreteRangedMinValue(0)
+                    .setDiscreteRangedMaxValue(100)
+                    .setShortTitle(WireComplicationText.plainText("battery"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as DiscreteRangedValueComplicationData
+        assertThat(deserialized.max).isEqualTo(100)
+        assertThat(deserialized.min).isEqualTo(0)
+        assertThat(deserialized.value).isEqualTo(95)
+        assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("content description")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("battery")
+
+        val data2 = DiscreteRangedValueComplicationData.Builder(
+            value = 95, min = 0, max = 100,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("battery".complicationText)
+            .setDataSource(dataSourceA)
+            .build()
+
+        val data3 = DiscreteRangedValueComplicationData.Builder(
+            value = 95, min = 0, max = 100,
+            contentDescription = "content description2".complicationText
+        )
+            .setTitle("battery2".complicationText)
+            .setDataSource(dataSourceB)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "DiscreteRangedValueComplicationData(value=95, min=0, max=100, " +
+                "monochromaticImage=null, title=ComplicationText{mSurroundingText=battery, " +
+                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText" +
+                "{mSurroundingText=content description, mTimeDependentText=null}), " +
+                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
+                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                "+1000000000-12-31T23:59:59.999999999Z), dataSource=ComponentInfo{com.pkg_a/com.a})"
         )
     }
 
@@ -293,8 +418,7 @@
         )
             .setTitle("battery".complicationText)
             .setDataSource(dataSourceA)
-            .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
-            .setColorRamp(RangedValueComplicationData.ColorRamp(Color.BLUE, Color.RED))
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
@@ -305,9 +429,8 @@
                     .setShortTitle(WireComplicationText.plainText("battery"))
                     .setContentDescription(WireComplicationText.plainText("content description"))
                     .setDataSource(dataSourceA)
-                    .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
-                    .setRangedMinColor(Color.BLUE)
-                    .setRangedMaxColor(Color.RED)
+                    .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                    .setColorRampIsSmoothShaded(true)
                     .build()
             )
         testRoundTripConversions(data)
@@ -326,18 +449,16 @@
         )
             .setTitle("battery".complicationText)
             .setDataSource(dataSourceA)
-            .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
-            .setColorRamp(RangedValueComplicationData.ColorRamp(Color.BLUE, Color.RED))
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
             .build()
 
         val data3 = RangedValueComplicationData.Builder(
             value = 95f, min = 0f, max = 100f,
             contentDescription = "content description2".complicationText
         )
-            .setTitle("battery2".complicationText)
+            .setTitle("battery".complicationText)
             .setDataSource(dataSourceB)
-            .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
-            .setColorRamp(RangedValueComplicationData.ColorRamp(Color.BLUE, Color.RED))
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.YELLOW), true))
             .build()
 
         assertThat(data).isEqualTo(data2)
@@ -352,8 +473,86 @@
                 "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
                 "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
                 "+1000000000-12-31T23:59:59.999999999Z), dataSource=" +
-                "ComponentInfo{com.pkg_a/com.a}, valueType=1, colorRamp=ColorRamp(" +
-                "minColor=-16776961, maxColor=-65536))"
+                "ComponentInfo{com.pkg_a/com.a}, colorRamp=ColorRamp(colors=[-65536, -16711936, " +
+                "-16776961], interpolated=true))"
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun weightedElementsComplicationData() {
+        val data = WeightedElementsComplicationData.Builder(
+            listOf(
+                WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+            ),
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("calories".complicationText)
+            .setDataSource(dataSourceA)
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
+                    .setElementWeights(floatArrayOf(0.5f, 1f, 2f))
+                    .setElementColors(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                    .setShortTitle(WireComplicationText.plainText("calories"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setDataSource(dataSourceA)
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as WeightedElementsComplicationData
+        assertThat(deserialized.elements).isEqualTo(
+            listOf(
+                WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+            )
+        )
+        assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("content description")
+        assertThat(deserialized.title!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("calories")
+
+        val data2 = WeightedElementsComplicationData.Builder(
+            listOf(
+                WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+            ),
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("calories".complicationText)
+            .setDataSource(dataSourceA)
+            .build()
+
+        val data3 = WeightedElementsComplicationData.Builder(
+            listOf(
+                WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                WeightedElementsComplicationData.Element(10f, Color.GREEN),
+                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+            ),
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("battery".complicationText)
+            .setDataSource(dataSourceA)
+            .build()
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "WeightedElementsComplicationData(elements=Element(color=-65536, weight=0.5)," +
+                " Element(color=-16711936, weight=1.0), Element(color=-16776961, weight=2.0), " +
+                "monochromaticImage=null, title=ComplicationText{mSurroundingText=calories, " +
+                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText{" +
+                "mSurroundingText=content description, mTimeDependentText=null}), " +
+                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
+                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, endDateTimeMillis=" +
+                "+1000000000-12-31T23:59:59.999999999Z), dataSource=ComponentInfo{com.pkg_a/com.a})"
         )
     }
 
@@ -556,7 +755,7 @@
                     max = 100f,
                     ComplicationText.EMPTY
                 )
-                    .setValueType(RangedValueComplicationData.ValueType.SCORE)
+                    .setText("battery".complicationText)
                     .build()
             ),
             ListComplicationData.StyleHint.RowOfColumns,
@@ -576,9 +775,7 @@
                                 .setRangedValue(95f)
                                 .setRangedMinValue(0f)
                                 .setRangedMaxValue(100f)
-                                .setValueType(
-                                    RangedValueComplicationData.ValueType.SCORE
-                                )
+                                .setShortText(WireComplicationText.plainText("battery"))
                                 .build()
                         )
                     )
@@ -597,7 +794,7 @@
                 max = 100f,
                 ComplicationText.EMPTY
             )
-                .setValueType(RangedValueComplicationData.ValueType.SCORE)
+                .setText("battery".complicationText)
                 .build()
         )
         assertThat(deserialized.styleHint).isEqualTo(ListComplicationData.StyleHint.RowOfColumns)
@@ -612,7 +809,7 @@
                     max = 100f,
                     ComplicationText.EMPTY
                 )
-                    .setValueType(RangedValueComplicationData.ValueType.SCORE)
+                    .setText("battery".complicationText)
                     .build()
             ),
             ListComplicationData.StyleHint.RowOfColumns,
@@ -628,7 +825,9 @@
                     min = 0f,
                     max = 100f,
                     ComplicationText.EMPTY
-                ).build()
+                )
+                    .setText("battery".complicationText)
+                    .build()
             ),
             ListComplicationData.StyleHint.RowOfColumns,
             ComplicationText.EMPTY
@@ -639,25 +838,26 @@
         assertThat(data.hashCode()).isEqualTo(data2.hashCode())
         assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
         assertThat(data.toString()).isEqualTo(
-            "ListComplicationData(complicationList=[ShortTextComplicationData(text=" +
-                "ComplicationText{mSurroundingText=text, mTimeDependentText=null}, title=null, " +
-                "monochromaticImage=null, contentDescription=ComplicationText{mSurroundingText=, " +
-                "mTimeDependentText=null}, tapActionLostDueToSerialization=false, tapAction=null," +
-                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+            "ListComplicationData(complicationList=[ShortTextComplicationData(" +
+                "text=ComplicationText{mSurroundingText=text, mTimeDependentText=null}, " +
+                "title=null, monochromaticImage=null, contentDescription=ComplicationText{" +
+                "mSurroundingText=, mTimeDependentText=null}, " +
+                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
+                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
                 "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), dataSource=null), " +
                 "RangedValueComplicationData(value=95.0, min=0.0, max=100.0, " +
-                "monochromaticImage=null, title=null, text=null, contentDescription=" +
+                "monochromaticImage=null, title=null, text=ComplicationText{" +
+                "mSurroundingText=battery, mTimeDependentText=null}, contentDescription=" +
                 "ComplicationText{mSurroundingText=, mTimeDependentText=null}), " +
-                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
-                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
-                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=null, valueType=3, colorRamp=null)], " +
-                "contentDescription=ComplicationText{mSurroundingText=, " +
-                "mTimeDependentText=null}, tapActionLostDueToSerialization=false, " +
-                "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
-                "-1000000000-01-01T00:00:00Z, endDateTimeMillis=+1000000000-12-31T23:59:" +
-                "59.999999999Z), dataSource=ComponentInfo{com.pkg_a/com.a}, styleHint=" +
-                "ListComplicationLayoutStyleHint(wireType=1))"
+                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
+                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), dataSource=null, " +
+                "colorRamp=null)], contentDescription=ComplicationText{mSurroundingText=, " +
+                "mTimeDependentText=null}, tapActionLostDueToSerialization=false, tapAction=null," +
+                " validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z," +
+                " endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), dataSource=" +
+                "ComponentInfo{com.pkg_a/com.a}, " +
+                "styleHint=ListComplicationLayoutStyleHint(wireType=1))"
         )
     }
 
@@ -804,7 +1004,6 @@
             )
                 .setText(ComplicationText.PLACEHOLDER)
                 .setDataSource(dataSourceA)
-                .setValueType(RangedValueComplicationData.ValueType.SCORE)
                 .build()
         )
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -820,7 +1019,6 @@
                                 WireComplicationText.plainText("content description")
                             )
                             .setDataSource(dataSourceA)
-                            .setValueType(RangedValueComplicationData.ValueType.SCORE)
                             .build()
                     )
                     .build()
@@ -839,7 +1037,6 @@
             )
                 .setText(ComplicationText.PLACEHOLDER)
                 .setDataSource(dataSourceA)
-                .setValueType(RangedValueComplicationData.ValueType.SCORE)
                 .build()
         )
         val data3 = NoDataComplicationData(
@@ -848,7 +1045,9 @@
                 min = 0f,
                 max = 100f,
                 "content description".complicationText
-            ).build()
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .build()
         )
 
         assertThat(data).isEqualTo(data2)
@@ -863,7 +1062,7 @@
                 "mTimeDependentText=null}), tapActionLostDueToSerialization=false, tapAction=" +
                 "null, validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
                 "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z)," +
-                " dataSource=ComponentInfo{com.pkg_a/com.a}, valueType=3, " +
+                " dataSource=ComponentInfo{com.pkg_a/com.a}, " +
                 "colorRamp=null), tapActionLostDueToSerialization=false, tapAction=null, " +
                 "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
                 "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z))"
@@ -872,6 +1071,247 @@
 
     @OptIn(ComplicationExperimental::class)
     @Test
+    public fun noDataComplicationData_goalProgress() {
+        val data = NoDataComplicationData(
+            GoalProgressComplicationData.Builder(
+                value = GoalProgressComplicationData.PLACEHOLDER,
+                targetValue = 10000f,
+                contentDescription = "content description".complicationText
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .setDataSource(dataSourceA)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+                .build()
+        )
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                    .setPlaceholder(
+                        WireComplicationDataBuilder(WireComplicationData.TYPE_GOAL_PROGRESS)
+                            .setRangedValue(GoalProgressComplicationData.PLACEHOLDER)
+                            .setTargetValue(10000f)
+                            .setShortText(ComplicationText.PLACEHOLDER.toWireComplicationText())
+                            .setContentDescription(
+                                WireComplicationText.plainText("content description")
+                            )
+                            .setDataSource(dataSourceA)
+                            .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                            .setColorRampIsSmoothShaded(false)
+                            .build()
+                    )
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as NoDataComplicationData
+        assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("content description")
+
+        val data2 = NoDataComplicationData(
+            GoalProgressComplicationData.Builder(
+                value = GoalProgressComplicationData.PLACEHOLDER,
+                targetValue = 10000f,
+                contentDescription = "content description".complicationText
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .setDataSource(dataSourceA)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+                .build()
+        )
+        val data3 = NoDataComplicationData(
+            GoalProgressComplicationData.Builder(
+                value = GoalProgressComplicationData.PLACEHOLDER,
+                targetValue = 10000f,
+                contentDescription = "content description".complicationText
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .build()
+        )
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "NoDataComplicationData(placeholder=GoalProgressComplicationData(" +
+                "value=3.4028235E38, targetValue=10000.0, monochromaticImage=null, title=null, " +
+                "text=ComplicationText{mSurroundingText=__placeholder__, " +
+                "mTimeDependentText=null}, contentDescription=ComplicationText{" +
+                "mSurroundingText=content description, mTimeDependentText=null}), " +
+                "tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=TimeRange(" +
+                "startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
+                "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], interpolated=false))," +
+                " tapActionLostDueToSerialization=false, tapAction=null, validTimeRange=" +
+                "TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z))"
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_discreteRangedValue() {
+        val data = NoDataComplicationData(
+            DiscreteRangedValueComplicationData.Builder(
+                value = DiscreteRangedValueComplicationData.PLACEHOLDER,
+                min = 0,
+                max = 100,
+                "content description".complicationText
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .setDataSource(dataSourceA)
+                .build()
+        )
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                    .setPlaceholder(
+                        WireComplicationDataBuilder(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE)
+                            .setDiscreteRangedValue(DiscreteRangedValueComplicationData.PLACEHOLDER)
+                            .setDiscreteRangedMinValue(0)
+                            .setDiscreteRangedMaxValue(100)
+                            .setShortText(ComplicationText.PLACEHOLDER.toWireComplicationText())
+                            .setContentDescription(
+                                WireComplicationText.plainText("content description")
+                            )
+                            .setDataSource(dataSourceA)
+                            .build()
+                    )
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as NoDataComplicationData
+        assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("content description")
+
+        val data2 = NoDataComplicationData(
+            DiscreteRangedValueComplicationData.Builder(
+                value = DiscreteRangedValueComplicationData.PLACEHOLDER,
+                min = 0,
+                max = 100,
+                "content description".complicationText
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .setDataSource(dataSourceA)
+                .build()
+        )
+        val data3 = NoDataComplicationData(
+            DiscreteRangedValueComplicationData.Builder(
+                value = DiscreteRangedValueComplicationData.PLACEHOLDER,
+                min = 0,
+                max = 100,
+                "content description".complicationText
+            )
+                .setTitle(ComplicationText.PLACEHOLDER)
+                .setText(ComplicationText.PLACEHOLDER)
+                .build()
+        )
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "NoDataComplicationData(placeholder=DiscreteRangedValueComplicationData(" +
+                "value=2147483647, min=0, max=100, monochromaticImage=null, title=null, " +
+                "text=ComplicationText{mSurroundingText=__placeholder__, mTimeDependentText=null" +
+                "}, contentDescription=ComplicationText{mSurroundingText=content description, " +
+                "mTimeDependentText=null}), tapActionLostDueToSerialization=false, tapAction=" +
+                "null, validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z)," +
+                " dataSource=ComponentInfo{com.pkg_a/com.a}), " +
+                "tapActionLostDueToSerialization=false, tapAction=null, " +
+                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z))"
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_weightedElements() {
+        val data = NoDataComplicationData(
+            WeightedElementsComplicationData.Builder(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                ),
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("calories".complicationText)
+                .setDataSource(dataSourceA)
+                .build()
+        )
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                    .setPlaceholder(
+                        WireComplicationDataBuilder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
+                            .setElementWeights(floatArrayOf(0.5f, 1f, 2f))
+                            .setElementColors(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                            .setShortTitle(WireComplicationText.plainText("calories"))
+                            .setContentDescription(
+                                WireComplicationText.plainText("content description")
+                            )
+                            .setDataSource(dataSourceA)
+                            .build()
+                    )
+                    .build()
+            )
+        testRoundTripConversions(data)
+        val deserialized = serializeAndDeserialize(data) as NoDataComplicationData
+        assertThat(deserialized.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("content description")
+
+        val data2 = NoDataComplicationData(
+            WeightedElementsComplicationData.Builder(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                ),
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("calories".complicationText)
+                .setDataSource(dataSourceA)
+                .build()
+        )
+        val data3 = NoDataComplicationData(
+            WeightedElementsComplicationData.Builder(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                ),
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("calories".complicationText)
+                .setDataSource(dataSourceA)
+                .build()
+        )
+
+        assertThat(data).isEqualTo(data2)
+        assertThat(data).isNotEqualTo(data3)
+        assertThat(data.hashCode()).isEqualTo(data2.hashCode())
+        assertThat(data.hashCode()).isNotEqualTo(data3.hashCode())
+        assertThat(data.toString()).isEqualTo(
+            "NoDataComplicationData(placeholder=WeightedElementsComplicationData(" +
+                "elements=Element(color=-65536, weight=0.5), Element(color=-16711936, " +
+                "weight=1.0), Element(color=-16776961, weight=2.0), monochromaticImage=null, " +
+                "title=ComplicationText{mSurroundingText=calories, mTimeDependentText=null}, " +
+                "text=null, contentDescription=ComplicationText{mSurroundingText=content " +
+                "description, mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
+                "tapAction=null, validTimeRange=TimeRange(startDateTimeMillis=" +
+                "-1000000000-01-01T00:00:00Z, " +
+                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
+                "dataSource=ComponentInfo{com.pkg_a/com.a}), " +
+                "tapActionLostDueToSerialization=false, tapAction=null, " +
+                "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
+                "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z))"
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
     public fun noDataComplicationData_rangedValue_with_ColorRange() {
         val data = NoDataComplicationData(
             RangedValueComplicationData.Builder(
@@ -882,8 +1322,7 @@
             )
                 .setText(ComplicationText.PLACEHOLDER)
                 .setDataSource(dataSourceA)
-                .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
-                .setColorRamp(RangedValueComplicationData.ColorRamp(Color.BLUE, Color.RED))
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
                 .build()
         )
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -899,9 +1338,8 @@
                                 WireComplicationText.plainText("content description")
                             )
                             .setDataSource(dataSourceA)
-                            .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
-                            .setRangedMinColor(Color.BLUE)
-                            .setRangedMaxColor(Color.RED)
+                            .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                            .setColorRampIsSmoothShaded(true)
                             .build()
                     )
                     .build()
@@ -920,8 +1358,7 @@
             )
                 .setText(ComplicationText.PLACEHOLDER)
                 .setDataSource(dataSourceA)
-                .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
-                .setColorRamp(RangedValueComplicationData.ColorRamp(Color.BLUE, Color.RED))
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
                 .build()
         )
         val data3 = NoDataComplicationData(
@@ -930,7 +1367,9 @@
                 min = 0f,
                 max = 100f,
                 "content description".complicationText
-            ).build()
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .build()
         )
 
         assertThat(data).isEqualTo(data2)
@@ -945,8 +1384,8 @@
                 "mTimeDependentText=null}), tapActionLostDueToSerialization=false, tapAction=" +
                 "null, validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
                 "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z), " +
-                "dataSource=ComponentInfo{com.pkg_a/com.a}, valueType=1, " +
-                "colorRamp=ColorRamp(minColor=-16776961, maxColor=-65536)), " +
+                "dataSource=ComponentInfo{com.pkg_a/com.a}, " +
+                "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], interpolated=true)), " +
                 "tapActionLostDueToSerialization=false, tapAction=null, " +
                 "validTimeRange=TimeRange(startDateTimeMillis=-1000000000-01-01T00:00:00Z, " +
                 "endDateTimeMillis=+1000000000-12-31T23:59:59.999999999Z))"
@@ -1220,7 +1659,6 @@
                 .setRangedMaxValue(100f)
                 .setShortTitle(WireComplicationText.plainText("battery"))
                 .setContentDescription(WireComplicationText.plainText("content description"))
-                .setValueType(RangedValueComplicationData.ValueType.SCORE)
                 .build(),
             ComplicationType.RANGED_VALUE
         )
@@ -1236,12 +1674,56 @@
                 .setRangedMaxValue(100f)
                 .setShortTitle(WireComplicationText.plainText("battery"))
                 .setContentDescription(WireComplicationText.plainText("content description"))
-                .setValueType(RangedValueComplicationData.ValueType.SCORE)
                 .build(),
             ComplicationType.RANGED_VALUE
         )
     }
 
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun goalProgressComplicationData() {
+        assertRoundtrip(
+            WireComplicationDataBuilder(WireComplicationData.TYPE_GOAL_PROGRESS)
+                .setRangedValue(1200f)
+                .setTargetValue(10000f)
+                .setShortTitle(WireComplicationText.plainText("steps"))
+                .setContentDescription(WireComplicationText.plainText("content description"))
+                .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                .setColorRampIsSmoothShaded(false)
+                .build(),
+            ComplicationType.GOAL_PROGRESS
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun discreteRangedValueComplicationData() {
+        assertRoundtrip(
+            WireComplicationDataBuilder(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE)
+                .setDiscreteRangedValue(95)
+                .setDiscreteRangedMinValue(0)
+                .setDiscreteRangedMaxValue(100)
+                .setShortTitle(WireComplicationText.plainText("battery"))
+                .setContentDescription(WireComplicationText.plainText("content description"))
+                .build(),
+            ComplicationType.DISCRETE_RANGED_VALUE
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun weightedElementsComplicationData() {
+        assertRoundtrip(
+            WireComplicationDataBuilder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
+                .setElementWeights(floatArrayOf(0.5f, 1f, 2f))
+                .setElementColors(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                .setShortTitle(WireComplicationText.plainText("calories"))
+                .setContentDescription(WireComplicationText.plainText("content description"))
+                .build(),
+            ComplicationType.WEIGHTED_ELEMENTS
+        )
+    }
+
     @Test
     public fun monochromaticImageComplicationData() {
         val icon = Icon.createWithContentUri("someuri")
@@ -1317,6 +1799,7 @@
             .setRangedValue(95f)
             .setRangedMinValue(0f)
             .setRangedMaxValue(100f)
+            .setShortText(WireComplicationText.plainText("battery"))
             .build()
 
         assertRoundtrip(
@@ -1386,7 +1869,6 @@
                         .setRangedMaxValue(100f)
                         .setShortTitle(WireComplicationText.plainText("battery"))
                         .setIcon(icon)
-                        .setValueType(RangedValueComplicationData.ValueType.SCORE)
                         .build()
                 )
                 .build(),
@@ -1410,7 +1892,6 @@
                         .setRangedMaxValue(100f)
                         .setShortTitle(WireComplicationText.plainText("battery"))
                         .setIcon(icon)
-                        .setValueType(RangedValueComplicationData.ValueType.SCORE)
                         .build()
                 )
                 .build(),
@@ -1418,6 +1899,72 @@
         )
     }
 
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_goalProgress() {
+        val icon = Icon.createWithContentUri("someuri")
+        assertRoundtrip(
+            WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                .setPlaceholder(
+                    WireComplicationDataBuilder(WireComplicationData.TYPE_GOAL_PROGRESS)
+                        .setRangedValue(1200f)
+                        .setTargetValue(10000f)
+                        .setShortTitle(WireComplicationText.plainText("steps"))
+                        .setContentDescription(
+                            WireComplicationText.plainText("content description")
+                        )
+                        .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                        .setColorRampIsSmoothShaded(true)
+                        .setIcon(icon)
+                        .build()
+                )
+                .build(),
+            ComplicationType.NO_DATA
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_discreteRangedValue() {
+        val icon = Icon.createWithContentUri("someuri")
+        assertRoundtrip(
+            WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                .setPlaceholder(
+                    WireComplicationDataBuilder(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE)
+                        .setContentDescription(
+                            WireComplicationText.plainText("content description")
+                        )
+                        .setDiscreteRangedValue(75)
+                        .setDiscreteRangedMinValue(0)
+                        .setDiscreteRangedMaxValue(100)
+                        .setShortTitle(WireComplicationText.plainText("battery"))
+                        .setIcon(icon)
+                        .build()
+                )
+                .build(),
+            ComplicationType.NO_DATA
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_weightedElementsComplicationData() {
+        assertRoundtrip(
+            WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                .setPlaceholder(
+                    WireComplicationDataBuilder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
+                        .setElementWeights(floatArrayOf(0.5f, 1f, 2f))
+                        .setElementColors(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                        .setShortTitle(WireComplicationText.plainText("calories"))
+                        .setContentDescription(
+                            WireComplicationText.plainText("content description")
+                        )
+                        .build()
+                ).build(),
+            ComplicationType.NO_DATA
+        )
+    }
+
     @Test
     public fun noDataComplicationData_smallImage() {
         val icon = Icon.createWithContentUri("someuri")
@@ -1485,6 +2032,7 @@
             .setRangedValue(95f)
             .setRangedMinValue(0f)
             .setRangedMaxValue(100f)
+            .setShortTitle(WireComplicationText.plainText("battery"))
             .build()
 
         assertRoundtrip(
@@ -1543,6 +2091,54 @@
                 value = 95f, min = 0f, max = 100f,
                 contentDescription = ComplicationText.EMPTY
             )
+                .setText("battery".complicationText)
+                .setTapAction(mPendingIntent)
+                .build().asWireComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun goalProgressComplicationData() {
+        assertThat(
+            GoalProgressComplicationData.Builder(
+                value = 1200f, targetValue = 10000f,
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("steps".complicationText)
+                .setTapAction(mPendingIntent)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+                .build().asWireComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun discreteRangedValueComplicationData() {
+        assertThat(
+            DiscreteRangedValueComplicationData.Builder(
+                value = 95, min = 0, max = 100,
+                contentDescription = ComplicationText.EMPTY
+            )
+                .setText("battery".complicationText)
+                .setTapAction(mPendingIntent)
+                .build().asWireComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun weightedElementsComplicationData() {
+        assertThat(
+            WeightedElementsComplicationData.Builder(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                ),
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("calories".complicationText)
                 .setTapAction(mPendingIntent)
                 .build().asWireComplicationData().tapAction
         ).isEqualTo(mPendingIntent)
@@ -1669,6 +2265,54 @@
                 value = 95f, min = 0f, max = 100f,
                 contentDescription = ComplicationText.EMPTY
             )
+                .setText("battery".complicationText)
+                .setTapAction(mPendingIntent)
+                .build().asWireComplicationData().toApiComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun goalProgressComplicationData() {
+        assertThat(
+            GoalProgressComplicationData.Builder(
+                value = 1200f, targetValue = 10000f,
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("steps".complicationText)
+                .setTapAction(mPendingIntent)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+                .build().asWireComplicationData().toApiComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun discreteRangedValueComplicationData() {
+        assertThat(
+            DiscreteRangedValueComplicationData.Builder(
+                value = 95, min = 0, max = 100,
+                contentDescription = ComplicationText.EMPTY
+            )
+                .setText("battery".complicationText)
+                .setTapAction(mPendingIntent)
+                .build().asWireComplicationData().toApiComplicationData().tapAction
+        ).isEqualTo(mPendingIntent)
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun weightedElementsComplicationData() {
+        assertThat(
+            WeightedElementsComplicationData.Builder(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                ),
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("calories".complicationText)
                 .setTapAction(mPendingIntent)
                 .build().asWireComplicationData().toApiComplicationData().tapAction
         ).isEqualTo(mPendingIntent)
@@ -1810,8 +2454,8 @@
             value = 95f, min = 0f, max = 100f,
             contentDescription = ComplicationText.EMPTY
         )
+            .setText("battery".complicationText)
             .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
-            .setValueType(RangedValueComplicationData.ValueType.SCORE)
             .build()
         ParcelableSubject.assertThat(data.asWireComplicationData())
             .hasSameSerializationAs(
@@ -1819,9 +2463,85 @@
                     .setRangedValue(95f)
                     .setRangedMinValue(0f)
                     .setRangedMaxValue(100f)
+                    .setShortText(WireComplicationText.plainText("battery"))
                     .setStartDateTimeMillis(testStartInstant.toEpochMilli())
                     .setEndDateTimeMillis(testEndDateInstant.toEpochMilli())
-                    .setValueType(RangedValueComplicationData.ValueType.SCORE)
+                    .build()
+            )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun goalProgressComplicationData() {
+        val data = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+            .setColorRamp(ColorRamp(intArrayOf(Color.YELLOW, Color.MAGENTA), true))
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_GOAL_PROGRESS)
+                    .setRangedValue(1200f)
+                    .setTargetValue(10000f)
+                    .setShortTitle(WireComplicationText.plainText("steps"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setColorRamp(intArrayOf(Color.YELLOW, Color.MAGENTA))
+                    .setColorRampIsSmoothShaded(true)
+                    .setStartDateTimeMillis(testStartInstant.toEpochMilli())
+                    .setEndDateTimeMillis(testEndDateInstant.toEpochMilli())
+                    .build()
+            )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun discreteRangedValueComplicationData() {
+        val data = DiscreteRangedValueComplicationData.Builder(
+            value = 95, min = 0, max = 100,
+            contentDescription = ComplicationText.EMPTY
+        )
+            .setText("battery".complicationText)
+            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE)
+                    .setDiscreteRangedValue(95)
+                    .setDiscreteRangedMinValue(0)
+                    .setDiscreteRangedMaxValue(100)
+                    .setShortText(WireComplicationText.plainText("battery"))
+                    .setStartDateTimeMillis(testStartInstant.toEpochMilli())
+                    .setEndDateTimeMillis(testEndDateInstant.toEpochMilli())
+                    .build()
+            )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun weightedElementsComplicationData() {
+        val data = WeightedElementsComplicationData.Builder(
+            listOf(
+                WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+            ),
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("calories".complicationText)
+            .setValidTimeRange(TimeRange.between(testStartInstant, testEndDateInstant))
+            .build()
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
+                    .setElementWeights(floatArrayOf(0.5f, 1f, 2f))
+                    .setElementColors(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                    .setShortTitle(WireComplicationText.plainText("calories"))
+                    .setContentDescription(WireComplicationText.plainText("content description"))
+                    .setStartDateTimeMillis(testStartInstant.toEpochMilli())
+                    .setEndDateTimeMillis(testEndDateInstant.toEpochMilli())
                     .build()
             )
     }
@@ -1921,7 +2641,7 @@
                     max = 100f,
                     ComplicationText.EMPTY
                 )
-                    .setValueType(RangedValueComplicationData.ValueType.SCORE)
+                    .setText("battery".complicationText)
                     .build()
             ),
             ListComplicationData.StyleHint.RowOfColumns,
@@ -1938,7 +2658,7 @@
             .setRangedValue(95f)
             .setRangedMinValue(0f)
             .setRangedMaxValue(100f)
-            .setValueType(RangedValueComplicationData.ValueType.SCORE)
+            .setShortText(WireComplicationText.plainText("battery"))
             .build()
 
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -2000,7 +2720,7 @@
                 max = 100f,
                 ComplicationText.EMPTY
             )
-                .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
+                .setText("battery".complicationText)
                 .build()
         )
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -2011,7 +2731,98 @@
                             .setRangedValue(95f)
                             .setRangedMinValue(0f)
                             .setRangedMaxValue(100f)
-                            .setValueType(RangedValueComplicationData.ValueType.DISCRETE)
+                            .setShortText(WireComplicationText.plainText("battery"))
+                            .build()
+                    )
+                    .build()
+            )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_goalProgress() {
+        val data = NoDataComplicationData(
+            GoalProgressComplicationData.Builder(
+                value = 1200f, targetValue = 10000f,
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("steps".complicationText)
+                .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), false))
+                .build()
+        )
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                    .setPlaceholder(
+                        WireComplicationDataBuilder(WireComplicationData.TYPE_GOAL_PROGRESS)
+                            .setRangedValue(1200f)
+                            .setTargetValue(10000f)
+                            .setShortTitle(WireComplicationText.plainText("steps"))
+                            .setContentDescription(
+                                WireComplicationText.plainText("content description")
+                            )
+                            .setColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                            .setColorRampIsSmoothShaded(false)
+                            .build()
+                    )
+                    .build()
+            )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_discreteRangedValue() {
+        val data = NoDataComplicationData(
+            DiscreteRangedValueComplicationData.Builder(
+                value = 95,
+                min = 0,
+                max = 100,
+                ComplicationText.EMPTY
+            )
+                .setText("battery".complicationText)
+                .build()
+        )
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                    .setPlaceholder(
+                        WireComplicationDataBuilder(WireComplicationData.TYPE_DISCRETE_RANGED_VALUE)
+                            .setDiscreteRangedValue(95)
+                            .setDiscreteRangedMinValue(0)
+                            .setDiscreteRangedMaxValue(100)
+                            .setShortText(WireComplicationText.plainText("battery"))
+                            .build()
+                    )
+                    .build()
+            )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    public fun noDataComplicationData_weightedElements() {
+        val data = NoDataComplicationData(
+            WeightedElementsComplicationData.Builder(
+                listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                ),
+                contentDescription = "content description".complicationText
+            )
+                .setTitle("calories".complicationText)
+                .build()
+        )
+        ParcelableSubject.assertThat(data.asWireComplicationData())
+            .hasSameSerializationAs(
+                WireComplicationDataBuilder(WireComplicationData.TYPE_NO_DATA)
+                    .setPlaceholder(
+                        WireComplicationDataBuilder(WireComplicationData.TYPE_WEIGHTED_ELEMENTS)
+                            .setElementWeights(floatArrayOf(0.5f, 1f, 2f))
+                            .setElementColors(intArrayOf(Color.RED, Color.GREEN, Color.BLUE))
+                            .setShortTitle(WireComplicationText.plainText("calories"))
+                            .setContentDescription(
+                                WireComplicationText.plainText("content description")
+                            )
                             .build()
                     )
                     .build()
@@ -2121,7 +2932,7 @@
                         max = 100f,
                         ComplicationText.EMPTY
                     )
-                        .setValueType(RangedValueComplicationData.ValueType.SCORE)
+                        .setText("battery".complicationText)
                         .build()
                 ),
                 ListComplicationData.StyleHint.RowOfColumns,
@@ -2137,7 +2948,7 @@
             .setRangedValue(95f)
             .setRangedMinValue(0f)
             .setRangedMaxValue(100f)
-            .setValueType(RangedValueComplicationData.ValueType.SCORE)
+            .setShortText(WireComplicationText.plainText("battery"))
             .build()
 
         ParcelableSubject.assertThat(data.asWireComplicationData())
@@ -2233,14 +3044,64 @@
             "=REDACTED, mTimeDependentText=null}, text=ComplicationText{mSurroundingText=REDACTED" +
             ", mTimeDependentText=null}, contentDescription=ComplicationText{mSurroundingText=" +
             "REDACTED, mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
-            "tapAction=null, validTimeRange=TimeRange(REDACTED), dataSource=null, " +
-            "valueType=0, colorRamp=null)"
+            "tapAction=null, validTimeRange=TimeRange(REDACTED), dataSource=null, colorRamp=null)"
         )
         assertThat(data.asWireComplicationData().toString()).isEqualTo(
             "ComplicationData{mType=5, mFields=REDACTED}"
         )
     }
 
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun goalProgress() {
+        val data = GoalProgressComplicationData.Builder(
+            value = 1200f, targetValue = 10000f,
+            contentDescription = "content description".complicationText
+        )
+            .setTitle("steps".complicationText)
+            .setColorRamp(ColorRamp(intArrayOf(Color.RED, Color.GREEN, Color.BLUE), true))
+            .build()
+
+        assertThat(data.toString()).isEqualTo(
+            "GoalProgressComplicationData(value=REDACTED, targetValue=10000.0, " +
+                "monochromaticImage=null, title=ComplicationText{mSurroundingText=REDACTED, " +
+                "mTimeDependentText=null}, text=null, contentDescription=ComplicationText{" +
+                "mSurroundingText=REDACTED, mTimeDependentText=null}), " +
+                "tapActionLostDueToSerialization=false, tapAction=null, " +
+                "validTimeRange=TimeRange(REDACTED), dataSource=null, " +
+                "colorRamp=ColorRamp(colors=[-65536, -16711936, -16776961], interpolated=true))"
+        )
+        assertThat(data.asWireComplicationData().toString()).isEqualTo(
+            "ComplicationData{mType=13, mFields=REDACTED}"
+        )
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun discreteRangedValue() {
+        val data = DiscreteRangedValueComplicationData.Builder(
+            50,
+            0,
+            100,
+            "content description".complicationText
+        )
+            .setText("text".complicationText)
+            .setTitle("title".complicationText)
+            .build()
+
+        assertThat(data.toString()).isEqualTo(
+            "DiscreteRangedValueComplicationData(value=REDACTED, " +
+            "min=0, max=100, monochromaticImage=null, title=ComplicationText{mSurroundingText" +
+            "=REDACTED, mTimeDependentText=null}, text=ComplicationText{mSurroundingText=REDACTED" +
+            ", mTimeDependentText=null}, contentDescription=ComplicationText{mSurroundingText=" +
+            "REDACTED, mTimeDependentText=null}), tapActionLostDueToSerialization=false, " +
+            "tapAction=null, validTimeRange=TimeRange(REDACTED), dataSource=null)"
+        )
+        assertThat(data.asWireComplicationData().toString()).isEqualTo(
+            "ComplicationData{mType=14, mFields=REDACTED}"
+        )
+    }
+
     @Test
     fun placeholder() {
         val data = NoDataComplicationData(
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt
index 18b19ef..110cb73 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/PlaceholderTest.kt
@@ -18,6 +18,7 @@
 
 import android.content.ComponentName
 import android.content.Context
+import android.graphics.Color
 import android.graphics.drawable.Icon
 import android.support.wearable.complications.ComplicationData
 import android.support.wearable.complications.ComplicationData.IMAGE_STYLE_ICON
@@ -187,17 +188,204 @@
     }
 
     @Test
-    fun absent_rangedValue() {
+    fun titleAbsent_rangedValue() {
         val placeholderRangedValue = NoDataComplicationData(
             RangedValueComplicationData.Builder(
                 value = RangedValueComplicationData.PLACEHOLDER,
                 min = 1f,
                 max = 10f,
                 contentDescription
-            ).build()
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .build()
         ).toWireFormatRoundTrip().placeholder as RangedValueComplicationData
 
-        assertThat(placeholderRangedValue.text).isNull()
+        assertThat(placeholderRangedValue.text).isEqualTo(ComplicationText.PLACEHOLDER)
+        assertThat(placeholderRangedValue.title).isNull()
+        assertThat(placeholderRangedValue.monochromaticImage).isNull()
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun placeholder_goalProgress() {
+        val placeholderGoalProgress = NoDataComplicationData(
+            GoalProgressComplicationData.Builder(
+                value = GoalProgressComplicationData.PLACEHOLDER,
+                targetValue = 10000f,
+                contentDescription
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .setTitle(ComplicationText.PLACEHOLDER)
+                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .build()
+        ).toWireFormatRoundTrip().placeholder as GoalProgressComplicationData
+
+        assertThat(placeholderGoalProgress.value).isEqualTo(RangedValueComplicationData.PLACEHOLDER)
+        assertThat(placeholderGoalProgress.text).isEqualTo(ComplicationText.PLACEHOLDER)
+        assertThat(placeholderGoalProgress.title).isEqualTo(ComplicationText.PLACEHOLDER)
+        assertThat(placeholderGoalProgress.monochromaticImage)
+            .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderGoalProgress.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("description")
+        assertThat(placeholderGoalProgress.hasPlaceholderFields()).isTrue()
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun normal_goalProgress() {
+        val placeholderGoalProgress = NoDataComplicationData(
+            GoalProgressComplicationData.Builder(
+                value = 1200f,
+                targetValue = 10000f,
+                contentDescription
+            )
+                .setText(text)
+                .setTitle(title)
+                .setMonochromaticImage(monochromaticImage)
+                .build()
+        ).toWireFormatRoundTrip().placeholder as GoalProgressComplicationData
+
+        assertThat(placeholderGoalProgress.text!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
+            text.getTextAt(resources, Instant.EPOCH)
+        )
+        assertThat(placeholderGoalProgress.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
+            title.getTextAt(resources, Instant.EPOCH)
+        )
+        assertThat(placeholderGoalProgress.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(placeholderGoalProgress.value).isEqualTo(1200f)
+        assertThat(placeholderGoalProgress.targetValue).isEqualTo(10000f)
+        assertThat(placeholderGoalProgress.hasPlaceholderFields()).isFalse()
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun placeholder_discreteRangedValue() {
+        val placeholderRangedValue = NoDataComplicationData(
+            DiscreteRangedValueComplicationData.Builder(
+                value = DiscreteRangedValueComplicationData.PLACEHOLDER,
+                min = 1,
+                max = 10,
+                contentDescription
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .setTitle(ComplicationText.PLACEHOLDER)
+                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .build()
+        ).toWireFormatRoundTrip().placeholder as DiscreteRangedValueComplicationData
+
+        assertThat(placeholderRangedValue.value)
+            .isEqualTo(DiscreteRangedValueComplicationData.PLACEHOLDER)
+        assertThat(placeholderRangedValue.text).isEqualTo(ComplicationText.PLACEHOLDER)
+        assertThat(placeholderRangedValue.title).isEqualTo(ComplicationText.PLACEHOLDER)
+        assertThat(placeholderRangedValue.monochromaticImage)
+            .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderRangedValue.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("description")
+        assertThat(placeholderRangedValue.hasPlaceholderFields()).isTrue()
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun normal_discreteRangedValue() {
+        val placeholderRangedValue = NoDataComplicationData(
+            DiscreteRangedValueComplicationData.Builder(
+                value = 7,
+                min = 1,
+                max = 10,
+                contentDescription
+            )
+                .setText(text)
+                .setTitle(title)
+                .setMonochromaticImage(monochromaticImage)
+                .build()
+        ).toWireFormatRoundTrip().placeholder as DiscreteRangedValueComplicationData
+
+        assertThat(placeholderRangedValue.text!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
+            text.getTextAt(resources, Instant.EPOCH)
+        )
+        assertThat(placeholderRangedValue.title!!.getTextAt(resources, Instant.EPOCH)).isEqualTo(
+            title.getTextAt(resources, Instant.EPOCH)
+        )
+        assertThat(placeholderRangedValue.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(placeholderRangedValue.value).isEqualTo(7)
+        assertThat(placeholderRangedValue.min).isEqualTo(1)
+        assertThat(placeholderRangedValue.max).isEqualTo(10)
+        assertThat(placeholderRangedValue.hasPlaceholderFields()).isFalse()
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun placeholder_weightedElements() {
+        val placeholderWeightedElements = NoDataComplicationData(
+            WeightedElementsComplicationData.Builder(
+                elements = WeightedElementsComplicationData.PLACEHOLDER,
+                contentDescription
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .setTitle(ComplicationText.PLACEHOLDER)
+                .setMonochromaticImage(MonochromaticImage.PLACEHOLDER)
+                .build()
+        ).toWireFormatRoundTrip().placeholder as WeightedElementsComplicationData
+
+        assertThat(placeholderWeightedElements.elements)
+            .isEqualTo(WeightedElementsComplicationData.PLACEHOLDER)
+        assertThat(placeholderWeightedElements.text).isEqualTo(ComplicationText.PLACEHOLDER)
+        assertThat(placeholderWeightedElements.title).isEqualTo(ComplicationText.PLACEHOLDER)
+        assertThat(placeholderWeightedElements.monochromaticImage)
+            .isEqualTo(MonochromaticImage.PLACEHOLDER)
+        assertThat(placeholderWeightedElements.contentDescription!!
+            .getTextAt(resources, Instant.EPOCH)).isEqualTo("description")
+        assertThat(placeholderWeightedElements.hasPlaceholderFields()).isTrue()
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun normal_weightedElements() {
+        val weightedElements = NoDataComplicationData(
+            WeightedElementsComplicationData.Builder(
+                elements = listOf(
+                    WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                    WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                    WeightedElementsComplicationData.Element(2f, Color.BLUE),
+                ),
+                contentDescription
+            )
+                .setText(text)
+                .setTitle(title)
+                .setMonochromaticImage(monochromaticImage)
+                .build()
+        ).toWireFormatRoundTrip().placeholder as WeightedElementsComplicationData
+
+        assertThat(weightedElements.elements).isEqualTo(
+            listOf(
+                WeightedElementsComplicationData.Element(0.5f, Color.RED),
+                WeightedElementsComplicationData.Element(1f, Color.GREEN),
+                WeightedElementsComplicationData.Element(2f, Color.BLUE),
+            )
+        )
+        assertThat(weightedElements.text).isEqualTo(text)
+        assertThat(weightedElements.title).isEqualTo(title)
+        assertThat(weightedElements.monochromaticImage).isEqualTo(monochromaticImage)
+        assertThat(weightedElements.contentDescription!!.getTextAt(resources, Instant.EPOCH))
+            .isEqualTo("description")
+        assertThat(weightedElements.hasPlaceholderFields()).isFalse()
+    }
+
+    @OptIn(ComplicationExperimental::class)
+    @Test
+    fun titleAbsent_discreteRangedValue() {
+        val placeholderRangedValue = NoDataComplicationData(
+            DiscreteRangedValueComplicationData.Builder(
+                value = DiscreteRangedValueComplicationData.PLACEHOLDER,
+                min = 1,
+                max = 10,
+                contentDescription
+            )
+                .setText(ComplicationText.PLACEHOLDER)
+                .build()
+        ).toWireFormatRoundTrip().placeholder as DiscreteRangedValueComplicationData
+
+        assertThat(placeholderRangedValue.text).isEqualTo(ComplicationText.PLACEHOLDER)
         assertThat(placeholderRangedValue.title).isNull()
         assertThat(placeholderRangedValue.monochromaticImage).isNull()
     }
diff --git a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
index 2f790f8..96524a6 100644
--- a/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
+++ b/wear/watchface/watchface-complications-rendering/src/main/java/androidx/wear/watchface/complications/rendering/ComplicationRenderer.java
@@ -878,7 +878,8 @@
      * Returns true if the data contains images. If there are, the images will be loaded
      * asynchronously and the drawable will be invalidated when loading is complete.
      */
-    private boolean loadDrawableIconAndImagesAsync() {
+    @VisibleForTesting
+    boolean loadDrawableIconAndImagesAsync() {
         Handler handler = new Handler(Looper.getMainLooper());
         Icon icon = null;
         Icon smallImage = null;
@@ -904,7 +905,7 @@
         }
 
         boolean hasImage = false;
-        if (icon != null) {
+        if (icon != null && !ImageKt.isPlaceholder(icon)) {
             hasImage = true;
             icon.loadDrawableAsync(
                     mContext,
@@ -923,7 +924,7 @@
                     handler);
         }
 
-        if (burnInProtectionIcon != null) {
+        if (burnInProtectionIcon != null && !ImageKt.isPlaceholder(burnInProtectionIcon)) {
             hasImage = true;
             burnInProtectionIcon.loadDrawableAsync(
                     mContext,
@@ -942,7 +943,7 @@
                     handler);
         }
 
-        if (smallImage != null) {
+        if (smallImage != null && !ImageKt.isPlaceholder(smallImage)) {
             hasImage = true;
             smallImage.loadDrawableAsync(
                     mContext,
@@ -960,7 +961,8 @@
                     handler);
         }
 
-        if (burnInProtectionSmallImage != null) {
+        if (burnInProtectionSmallImage != null
+                && !ImageKt.isPlaceholder(burnInProtectionSmallImage)) {
             hasImage = true;
             burnInProtectionSmallImage.loadDrawableAsync(
                     mContext,
@@ -978,7 +980,7 @@
                     handler);
         }
 
-        if (largeImage != null) {
+        if (largeImage != null && !ImageKt.isPlaceholder(largeImage)) {
             hasImage = true;
             largeImage.loadDrawableAsync(
                     mContext,
diff --git a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
index 88efeb2..4d96d88 100644
--- a/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
+++ b/wear/watchface/watchface-complications-rendering/src/test/java/androidx/wear/watchface/complications/rendering/ComplicationRendererTest.java
@@ -64,7 +64,6 @@
 import com.google.common.truth.Truth;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -1102,7 +1101,6 @@
         assertThat(output).isEqualTo(Color.WHITE);
     }
 
-    @Ignore // b/238635208
     @Test
     public void placeholderIcon() {
         mComplicationRenderer.setComplicationData(
@@ -1114,7 +1112,6 @@
         assertThat(mComplicationRenderer.mIsPlaceholderIcon).isTrue();
     }
 
-    @Ignore // b/238635208
     @Test
     public void placeholderSmallImage() {
         mComplicationRenderer.setComplicationData(
@@ -1126,7 +1123,6 @@
         assertThat(mComplicationRenderer.mIsPlaceholderSmallImage).isTrue();
     }
 
-    @Ignore // b/238635208
     @Test
     public void placeholderPhotoImage() {
         mComplicationRenderer.setComplicationData(
@@ -1140,10 +1136,13 @@
 
     @Test
     public void placeholderRangedValue() {
+        androidx.wear.watchface.complications.data.ComplicationText placeholderText =
+                androidx.wear.watchface.complications.data.ComplicationText.PLACEHOLDER;
         mComplicationRenderer.setComplicationData(
                 new NoDataComplicationData(
                         new RangedValueComplicationData.Builder(
                                 RangedValueComplicationData.PLACEHOLDER, 0f, 100f, EMPTY_TEXT)
+                                .setTitle(placeholderText)
                                 .build())
                         .asWireComplicationData(),
                 true);
@@ -1195,6 +1194,39 @@
         assertThat(mComplicationRenderer.mIsPlaceholderText).isTrue();
     }
 
+    @Test
+    public void placeholderIcon_notLoadedAsync() {
+        mComplicationRenderer.setComplicationData(
+                new NoDataComplicationData(
+                        new MonochromaticImageComplicationData.Builder(
+                                MonochromaticImage.PLACEHOLDER, EMPTY_TEXT).build())
+                        .asWireComplicationData(),
+                true);
+        assertThat(mComplicationRenderer.loadDrawableIconAndImagesAsync()).isFalse();
+    }
+
+    @Test
+    public void placeholderSmallImage_notLoadedAsync() {
+        mComplicationRenderer.setComplicationData(
+                new NoDataComplicationData(
+                        new SmallImageComplicationData.Builder(
+                                SmallImage.PLACEHOLDER, EMPTY_TEXT).build())
+                        .asWireComplicationData(),
+                true);
+        assertThat(mComplicationRenderer.loadDrawableIconAndImagesAsync()).isFalse();
+    }
+
+    @Test
+    public void placeholderPhotoImage_notLoadedAsync() {
+        mComplicationRenderer.setComplicationData(
+                new NoDataComplicationData(
+                        new PhotoImageComplicationData.Builder(
+                                PhotoImageComplicationData.PLACEHOLDER, EMPTY_TEXT).build())
+                        .asWireComplicationData(),
+                true);
+        assertThat(mComplicationRenderer.loadDrawableIconAndImagesAsync()).isFalse();
+    }
+
     private Drawable loadIconFromMock(Icon icon) {
         ArgumentCaptor<OnDrawableLoadedListener> listenerArgumentCaptor =
                 ArgumentCaptor.forClass(OnDrawableLoadedListener.class);
diff --git a/wear/watchface/watchface-complications-rendering/src/test/resources/robolectric.properties b/wear/watchface/watchface-complications-rendering/src/test/resources/robolectric.properties
index 80e2a6f..ce87047 100644
--- a/wear/watchface/watchface-complications-rendering/src/test/resources/robolectric.properties
+++ b/wear/watchface/watchface-complications-rendering/src/test/resources/robolectric.properties
@@ -1 +1,3 @@
-# robolectric properties
+# Robolectric currently doesn't support API 30, so we have to explicitly specify 29 as the target
+# sdk for now. Remove when no longer necessary.
+sdk=29
diff --git a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java
index dcd4a57..8e4b748 100644
--- a/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java
+++ b/wear/watchface/watchface-data/src/main/java/androidx/wear/watchface/data/IdAndComplicationDataWireFormat.java
@@ -28,6 +28,8 @@
 import androidx.versionedparcelable.VersionedParcelable;
 import androidx.versionedparcelable.VersionedParcelize;
 
+import java.util.Objects;
+
 /**
  * Wire format to encode a pair of id to {@link ComplicationData}.
  *
@@ -89,4 +91,24 @@
                     return new IdAndComplicationDataWireFormat[size];
                 }
             };
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        IdAndComplicationDataWireFormat that = (IdAndComplicationDataWireFormat) o;
+        return mId == that.mId && mComplicationData.equals(that.mComplicationData);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mId, mComplicationData);
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return "IdAndComplicationDataWireFormat{"
+                + "mId=" + mId + ", mComplicationData=" + mComplicationData + '}';
+    }
 }
diff --git a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
index 81734c6..bf63d1b 100644
--- a/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
+++ b/wear/watchface/watchface/src/androidTest/java/androidx/wear/watchface/test/WatchFaceServiceImageTest.kt
@@ -37,7 +37,6 @@
 import androidx.annotation.RequiresApi
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.MediumTest
 import androidx.test.screenshot.AndroidXScreenshotTestRule
 import androidx.test.screenshot.assertAgainstGolden
@@ -94,6 +93,9 @@
 import java.time.ZoneId
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.android.asCoroutineDispatcher
+import kotlinx.coroutines.launch
 
 private const val BITMAP_WIDTH = 400
 private const val BITMAP_HEIGHT = 400
@@ -546,12 +548,24 @@
 
     @SuppressLint("NewApi")
     @Test
-    @FlakyTest(bugId = 227456150)
     public fun testPlaceholderComplications() {
         val latch = CountDownLatch(1)
         handler.post(this::initCanvasWatchFace)
         assertThat(initLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
 
+        // Latch that countsDown when the complication below has been delivered.
+        val complicationReceivedLatch = CountDownLatch(1)
+        CoroutineScope(handler.asCoroutineDispatcher()).launch {
+            engineWrapper.deferredWatchFaceImpl.await().complicationSlotsManager[
+                EXAMPLE_CANVAS_WATCHFACE_LEFT_COMPLICATION_ID
+            ]!!.complicationData.collect {
+                if (it is NoDataComplicationData && it.placeholder != null) {
+                    complicationReceivedLatch.countDown()
+                }
+            }
+        }
+
+        // This is a oneway call.
         interactiveWatchFaceInstance.updateComplicationData(
             listOf(
                 IdAndComplicationDataWireFormat(
@@ -583,6 +597,8 @@
             )
         )
 
+        assertThat(complicationReceivedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)).isTrue()
+
         var bitmap: Bitmap? = null
         pretendBinderHandler.post {
             bitmap = SharedMemoryImage.ashmemReadImageBundle(
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 279dd52..f0357e0 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
@@ -49,6 +49,8 @@
 import kotlin.math.cos
 import kotlin.math.sin
 import java.time.Instant
+import java.time.LocalDateTime
+import java.time.ZoneId
 import java.time.ZonedDateTime
 import java.util.Objects
 
@@ -989,8 +991,8 @@
         }
 
         if (forceUpdate || complicationData.value != best) {
-            (complicationData as MutableStateFlow).value = best
             renderer.loadData(best, loadDrawablesAsynchronous)
+            (complicationData as MutableStateFlow).value = best
         }
     }
 
@@ -1171,6 +1173,7 @@
         writer.println("defaultDataSourcePolicy.systemDataSourceFallbackDefaultType=" +
             defaultDataSourcePolicy.systemDataSourceFallbackDefaultType)
         writer.println("timelineComplicationData=$timelineComplicationData")
+        writer.println("timelineEntries=" + timelineEntries?.joinToString())
         writer.println("data=${renderer.getData()}")
         @OptIn(ComplicationExperimental::class)
         writer.println("boundingArc=$boundingArc")
@@ -1179,7 +1182,8 @@
         complicationHistory?.let {
             writer.increaseIndent()
             for (entry in it) {
-                writer.println("${entry.complicationData} @ ${entry.time}")
+                val localDateTime = LocalDateTime.ofInstant(entry.time, ZoneId.systemDefault())
+                writer.println("${entry.complicationData} @ $localDateTime")
             }
             writer.decreaseIndent()
         }
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
index efea374..5cae565e 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlotsManager.kt
@@ -21,6 +21,7 @@
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.util.Log
 import androidx.annotation.Px
 import androidx.annotation.RestrictTo
 import androidx.annotation.UiThread
@@ -60,6 +61,10 @@
     complicationSlotCollection: Collection<ComplicationSlot>,
     private val currentUserStyleRepository: CurrentUserStyleRepository
 ) {
+    internal companion object {
+        internal const val TAG = "ComplicationSlotsManager"
+    }
+
     /**
      * Interface used to report user taps on the [ComplicationSlot]. See [addTapListener] and
      * [removeTapListener].
@@ -283,7 +288,15 @@
         data: ComplicationData,
         instant: Instant
     ) {
-        val complication = complicationSlots[complicationSlotId] ?: return
+        val complication = complicationSlots[complicationSlotId]
+        if (complication == null) {
+            Log.e(
+                TAG,
+                "onComplicationDataUpdate failed due to invalid complicationSlotId=" +
+                    "$complicationSlotId with data=$data"
+            )
+            return
+        }
         complication.dataDirty = complication.dataDirty ||
             (complication.renderer.getData() != data)
         complication.setComplicationData(data, true, instant)
@@ -298,7 +311,15 @@
         data: ComplicationData,
         instant: Instant
     ) {
-        val complication = complicationSlots[complicationSlotId] ?: return
+        val complication = complicationSlots[complicationSlotId]
+        if (complication == null) {
+            Log.e(
+                TAG,
+                "setComplicationDataUpdateSync failed due to invalid complicationSlotId=" +
+                    "$complicationSlotId with data=$data"
+            )
+            return
+        }
         complication.setComplicationData(data, false, instant)
     }
 
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 3e2674e..edeb256 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
@@ -359,7 +359,7 @@
                         }
                     }
                 } catch (e: Exception) {
-                    Log.e(HeadlessWatchFaceImpl.TAG, "Operation failed", e)
+                    Log.e(TAG, "Operation failed", e)
                     throw e
                 }
             }
@@ -1194,7 +1194,8 @@
         private var asyncWatchFaceConstructionPending = false
 
         // Stores the initial ComplicationSlots which could get updated before they're applied.
-        private var pendingInitialComplications: List<IdAndComplicationDataWireFormat>? = null
+        internal var pendingInitialComplications: List<IdAndComplicationDataWireFormat>? = null
+            private set
 
         private var initialUserStyle: UserStyleWireFormat? = null
         private lateinit var interactiveInstanceId: String
@@ -1449,9 +1450,29 @@
                 }
                 watchFaceImpl.complicationSlotsManager.onComplicationsUpdated()
             } else {
-                // If the watchface hasn't been created yet, update pendingInitialComplications so
-                // it can be applied later.
+                setPendingInitialComplications(complicationDataWireFormats)
+            }
+        }
+
+        @UiThread
+        internal fun setPendingInitialComplications(
+            complicationDataWireFormats: List<IdAndComplicationDataWireFormat>
+        ) {
+            // If the watchface hasn't been created yet, update pendingInitialComplications so
+            // it can be applied later.
+            if (pendingInitialComplications == null) {
                 pendingInitialComplications = complicationDataWireFormats
+            } else {
+                // We need to merge the updates.
+                val complicationUpdateMap = pendingInitialComplications!!.associate {
+                    Pair(it.id, it.complicationData)
+                }.toMutableMap()
+                for (data in complicationDataWireFormats) {
+                    complicationUpdateMap[data.id] = data.complicationData
+                }
+                pendingInitialComplications = complicationUpdateMap.map {
+                    IdAndComplicationDataWireFormat(it.key, it.value)
+                }
             }
         }
 
@@ -2021,16 +2042,6 @@
             initStyleAndComplicationsDone: CompletableDeferred<Unit>,
             watchState: WatchState
         ) {
-            pendingInitialComplications?.let {
-                for (idAndData in it) {
-                    complicationSlotsManager.onComplicationDataUpdate(
-                        idAndData.id,
-                        idAndData.complicationData.toApiComplicationData(),
-                        Instant.EPOCH // The value here doesn't matter, will be corrected when drawn
-                    )
-                }
-            }
-
             val broadcastsObserver = BroadcastsObserver(
                 watchState,
                 this,
@@ -2088,6 +2099,15 @@
                     pendingUserStyle = null
                 }
                 deferredWatchFaceImpl.complete(watchFaceImpl)
+
+                // Apply any pendingInitialComplications, this must be done after
+                // deferredWatchFaceImpl has completed or there's a window in which complication
+                // updates get lost.
+                pendingInitialComplications?.let {
+                    setComplicationDataList(it)
+                }
+                pendingInitialComplications = null
+
                 asyncWatchFaceConstructionPending = false
                 watchFaceImpl.initComplete = true
 
@@ -2491,6 +2511,9 @@
 
             writer.println("frameCallbackPending=$frameCallbackPending")
             writer.println("destroyed=$destroyed")
+            writer.println(
+                "pendingInitialComplications=" + pendingInitialComplications?.joinToString()
+            )
 
             if (!destroyed) {
                 getWatchFaceImplOrNull()?.dump(writer)
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index 1764bd8..bfda284 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -149,6 +149,10 @@
     ): Unit = uiThreadCoroutineScope.runBlockingWithTracing(
         "InteractiveWatchFaceImpl.updateComplicationData"
     ) {
+        if ("user" != Build.TYPE) {
+            Log.d(TAG, "updateComplicationData " + complicationDatumWireFormats.joinToString())
+        }
+
         engine?.setComplicationDataList(complicationDatumWireFormats)
             ?: Log.d(TAG, "updateComplicationData ignored due to null engine id $instanceId")
     }
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 e3b70f8..b821831 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
@@ -5432,6 +5432,46 @@
         assertThat(renderer.lastOnDrawZonedDateTime).isNull()
     }
 
+    @Test
+    public fun setPendingInitialComplications() {
+        initEngine(
+            WatchFaceType.ANALOG,
+            listOf(leftComplication, rightComplication),
+            UserStyleSchema(emptyList())
+        )
+
+        val left1 = IdAndComplicationDataWireFormat(
+            LEFT_COMPLICATION_ID,
+            ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(ComplicationText.plainText("Left1"))
+                .build()
+        )
+
+        val left2 = IdAndComplicationDataWireFormat(
+            LEFT_COMPLICATION_ID,
+            ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(ComplicationText.plainText("Left2"))
+                .build()
+        )
+
+        val right = IdAndComplicationDataWireFormat(
+            RIGHT_COMPLICATION_ID,
+            ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)
+                .setShortText(ComplicationText.plainText("Right"))
+                .build()
+        )
+
+        engineWrapper.setPendingInitialComplications(listOf(left1))
+        assertThat(engineWrapper.pendingInitialComplications).containsExactly(left1)
+
+        // Check merges are working as expected.
+        engineWrapper.setPendingInitialComplications(listOf(right))
+        assertThat(engineWrapper.pendingInitialComplications).containsExactly(left1, right)
+
+        engineWrapper.setPendingInitialComplications(listOf(left2))
+        assertThat(engineWrapper.pendingInitialComplications).containsExactly(left2, right)
+    }
+
     private fun getLeftShortTextComplicationDataText(): CharSequence {
         val complication = complicationSlotsManager[
             LEFT_COMPLICATION_ID
diff --git a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
index 0a57d48..1d305cc 100644
--- a/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
+++ b/webkit/webkit/src/androidTest/java/androidx/webkit/WebSettingsCompatForceDarkTest.java
@@ -25,6 +25,7 @@
 
 import androidx.core.graphics.ColorUtils;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.FlakyTest;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SdkSuppress;
 
@@ -65,6 +66,7 @@
      * should be reflected in that test as necessary. See http://go/modifying-webview-cts.
      */
     @SuppressWarnings("deprecation")
+    @FlakyTest(bugId = 230480958)
     @Test
     public void testForceDark_rendersDark() throws Throwable {
         WebkitUtils.checkFeature(WebViewFeature.FORCE_DARK);
diff --git a/window/window-samples/lint-baseline.xml b/window/window-samples/lint-baseline.xml
deleted file mode 100644
index 1fa304a..0000000
--- a/window/window-samples/lint-baseline.xml
+++ /dev/null
@@ -1,11 +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="NotificationPermission"
-        message="When targeting Android 13 or higher, posting a permission requires holding the `POST_NOTIFICATIONS` permission (usage from leakcanary.NotificationEventListener)">
-        <location
-            file="$GRADLE_USER_HOME/caches/transforms-3/4366a02f2b10003dc48387e903833c2d/transformed/leakcanary-android-core-2.8.1/jars/classes.jar"/>
-    </issue>
-
-</issues>
diff --git a/window/window/src/main/java/androidx/window/WindowProperties.kt b/window/window/src/main/java/androidx/window/WindowProperties.kt
index 82a3319..f661df6 100644
--- a/window/window/src/main/java/androidx/window/WindowProperties.kt
+++ b/window/window/src/main/java/androidx/window/WindowProperties.kt
@@ -32,8 +32,8 @@
      * be used if the app wants to provide their own ActivityEmbedding split rules, or if the
      * app wants to opt-out of system overrides for any other reason.
      * <p>Default is `false`.
-     * <p>The system enforcement will be added in Android 14, but some devices may start following
-     * the requirement before that. The best practice for apps is to always explicitly set this
+     * <p>The system enforcement is added in Android 14, but some devices may start following the
+     * requirement before that. The best practice for apps is to always explicitly set this
      * property in AndroidManifest instead of relying on the default value.
      * <p>Example usage:
      * <pre>
diff --git a/work/integration-tests/testapp/lint-baseline.xml b/work/integration-tests/testapp/lint-baseline.xml
index a86a1ea..e53ba4e 100644
--- a/work/integration-tests/testapp/lint-baseline.xml
+++ b/work/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.3.0-alpha07" type="baseline" client="gradle" dependencies="false" name="AGP (7.3.0-alpha07)" variant="all" version="7.3.0-alpha07">
+<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"
@@ -74,96 +74,6 @@
     </issue>
 
     <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mImageRecyclerViewAdapter` of class `ImageProcessingActivity` requires synthetic accessor"
-        errorLine1="                        mImageRecyclerViewAdapter.updateList(images);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mShouldLoad` of class `ViewHolder` requires synthetic accessor"
-        errorLine1="                        if (mShouldLoad) {"
-        errorLine2="                            ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageRecyclerViewAdapter.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mImageView` of class `ViewHolder` requires synthetic accessor"
-        errorLine1="                            mImageView.setImageBitmap(bitmap);"
-        errorLine2="                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageRecyclerViewAdapter.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTextView` of class `ViewHolder` requires synthetic accessor"
-        errorLine1="                            mTextView.setText(image.mOriginalAssetName);"
-        errorLine2="                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageRecyclerViewAdapter.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mProgressBar` of class `ViewHolder` requires synthetic accessor"
-        errorLine1="                            mProgressBar.setVisibility(View.GONE);"
-        errorLine2="                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageRecyclerViewAdapter.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mImageView` of class `ViewHolder` requires synthetic accessor"
-        errorLine1="                            mImageView.setVisibility(View.VISIBLE);"
-        errorLine2="                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/imageprocessing/ImageRecyclerViewAdapter.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `scheduleWork` of class `RetryActivity` requires synthetic accessor"
-        errorLine1="                scheduleWork(&quot;one&quot;, 3, 0.2);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/RetryActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` method `scheduleWork` of class `RetryActivity` requires synthetic accessor"
-        errorLine1="                scheduleWork(&quot;two&quot;, 5, 0.5);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/RetryActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTextView` of class `RetryActivity` requires synthetic accessor"
-        errorLine1="                            mTextView.setText(&quot;nothing to show&quot;);"
-        errorLine2="                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/RetryActivity.java"/>
-    </issue>
-
-    <issue
-        id="SyntheticAccessor"
-        message="Access to `private` field `mTextView` of class `RetryActivity` requires synthetic accessor"
-        errorLine1="                            mTextView.setText(text);"
-        errorLine2="                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/work/integration/testapp/RetryActivity.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(final Bundle savedInstanceState) {"
diff --git a/work/work-inspection/lint-baseline.xml b/work/work-inspection/lint-baseline.xml
index 2ddb484..677478e 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="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="RemoveWorkManagerInitializer"
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java b/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
index cf9679b..9413fc0 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
@@ -38,6 +38,7 @@
 import android.database.sqlite.SQLiteConstraintException;
 import android.database.sqlite.SQLiteDatabaseCorruptException;
 import android.database.sqlite.SQLiteDatabaseLockedException;
+import android.database.sqlite.SQLiteDiskIOException;
 import android.database.sqlite.SQLiteException;
 import android.database.sqlite.SQLiteTableLockedException;
 import android.os.Build;
@@ -133,6 +134,7 @@
                     forceStopRunnable();
                     break;
                 } catch (SQLiteCantOpenDatabaseException
+                         | SQLiteDiskIOException
                          | SQLiteDatabaseCorruptException
                          | SQLiteDatabaseLockedException
                          | SQLiteTableLockedException