Merge "Enforce java warnings for android library test code" into androidx-master-dev
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index c80cea4..baf38e0 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -3,6 +3,9 @@
   - name: Activity
     url: https://issuetracker.google.com/issues/new?component=527362&template=1189829
     about: File a bug or feature request for Activity
+  - name: Biometric
+    url: https://issuetracker.google.com/issues/new?component=559537&template=1214425
+    about: File a bug or feature request for Biometric
   - name: Fragment
     url: https://issuetracker.google.com/issues/new?component=460964&template=1182267
     about: File a bug or feature request for Fragment
diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml
index 3fd78ec..c1dee53d 100644
--- a/.github/workflows/presubmit.yml
+++ b/.github/workflows/presubmit.yml
@@ -85,6 +85,59 @@
         if: always()
         run: echo ::set-output name=status::${{ job.status }}
 
+  build-biometric:
+    strategy:
+      fail-fast: false
+      matrix:
+        os: [macos-latest]
+    runs-on: ${{ matrix.os }}
+    needs: [setup, lint]
+    outputs:
+      status: ${{ steps.output-status.outputs.status }}
+    env:
+      group-id: "biometric"
+    steps:
+      - name: "Checkout androidx repo"
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 1
+
+      - name: "Setup JDK 11"
+        id: setup-java
+        uses: actions/setup-java@v1
+        with:
+          java-version: "11"
+
+      - name: "Set environment variables"
+        shell: bash
+        run: |
+          set -x
+          echo "ANDROID_SDK_ROOT=$HOME/Library/Android/sdk" >> $GITHUB_ENV
+          echo "DIST_DIR=$HOME/dist" >> $GITHUB_ENV
+
+      - name: "./gradlew buildOnServer"
+        uses: eskatos/gradle-command-action@v1
+        env:
+          JAVA_HOME: ${{ steps.setup-java.outputs.path }}
+        with:
+          arguments: buildOnServer
+          build-root-directory: ${{ env.group-id }}
+          gradle-executable: ${{ env.group-id }}/gradlew
+          wrapper-directory: ${{ env.group-id }}/gradle/wrapper
+
+      - name: "Upload build artifacts"
+        continue-on-error: true
+        if: always()
+        uses: actions/upload-artifact@v2
+        with:
+          name: artifacts_${{ env.group-id }}
+          path: ~/dist
+
+      - name: "Report job status"
+        id: output-status
+        if: always()
+        run: echo ::set-output name=status::${{ job.status }}
+
   build-fragment:
     strategy:
       fail-fast: false
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ba9d647..4fc8df1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,6 +10,7 @@
 
 You can start contributing to any of the following library groups from GitHub:
   - [Activity](https://developer.android.com/guide/components/activities/intro-activities)
+  - [Biometric](https://developer.android.com/training/sign-in/biometric-auth)
   - [Fragment](https://developer.android.com/guide/components/fragments)
   - [Navigation](https://developer.android.com/guide/navigation)
   - [Paging](https://developer.android.com/topic/libraries/architecture/paging)
@@ -45,6 +46,7 @@
 ```
 androidx
   -- activity
+  -- biometric
   -- fragment
   -- navigation
   -- paging
@@ -52,7 +54,7 @@
   -- work
 ```
 
-**Note:** For other projects, you will still need to use the Gerrit workflow used by the Android Open Source Project (AOSP). For more information, please look at the [README](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:README.md).
+**Note:** For other projects, you will still need to use the Gerrit workflow used by the Android Open Source Project (AOSP). For more information, please look at the [README](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:README.md).
 
 Fork the [androidx/androidx](https://github.com/androidx/androidx) repository.
 
@@ -120,7 +122,7 @@
 ./gradlew updateApi
 ```
 
-If you are adding new APIs, then you might **additionally need to update** [LibraryVersions.kt](https://github.com/androidx/androidx/blob/androidx-master-dev/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt) as well, before running the updateApi task. This is **relevant when the library’s API is frozen** (betas, rc’s and stable versions). For alpha versions, you don’t have to update this file.
+If you are adding new APIs, then you might **additionally need to update** [LibraryVersions.kt](https://github.com/androidx/androidx/blob/androidx-main/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt) as well, before running the updateApi task. This is **relevant when the library’s API is frozen** (betas, rc’s and stable versions). For alpha versions, you don’t have to update this file.
 
 This helps the AndroidX project keep track of API changes and avoid inadvertently adding APIs or introduce backwards incompatible changes.
 
@@ -153,17 +155,17 @@
 
 ### The Pull Request Workflow
 
-AndroidX is primarily developed in [AOSP](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev). This flow simply mirrors pull requests from GitHub into Gerrit, For all intents and purposes, AOSP is the **single** **source of truth**, all changes will be merged in Gerrit and mirrored back to GitHub.
+AndroidX is primarily developed in [AOSP](https://android.googlesource.com/platform/frameworks/support/+/androidx-main). This flow simply mirrors pull requests from GitHub into Gerrit, For all intents and purposes, AOSP is the **single** **source of truth**, all changes will be merged in Gerrit and mirrored back to GitHub.
 
 Here is what a typical pull request workflow looks like:
 
-1.  Create a GitHub pull request from **your forked repository** to the androidx-master-dev branch on GitHub.
+1.  Create a GitHub pull request from **your forked repository** to the androidx-main branch on GitHub.
 2.  Sign the Contributor’s License Agreement at https://cla.developers.google.com/ to get @googlebot to give you the `cla: yes` label.
 3.  Your PR will be reviewed using the GitHub pull request flow. You can address the comments / suggestions in your forked repository and update the pull request as normal.
 4.  Once the changes look good, a Googler will Approve your pull request on GitHub.
 5.  Your PR will be **tested using GitHub workflows**. You can monitor these GitHub workflows by using the Actions tab in your forked repository.
 6.  Once your **pull request has been approved** by a Googler, it will also be **mirrored to AOSP Gerrit**. You can find the link to Gerrit under the status check, `import/copybara` left by `@copybara-service`, by clicking details.
-7.  Once **all** the checks in **Gerrit and GitHub** pass, your change will get merged in androidx-master-dev in AOSP and mirrored back to androidx-master-dev in GitHub. Congratulations, your change landed in AOSP!
+7.  Once **all** the checks in **Gerrit and GitHub** pass, your change will get merged in androidx-main in AOSP and mirrored back to androidx-main in GitHub. Congratulations, your change landed in AOSP!
 8.  Currently, your pull request will not get automatically closed when your changes are merged. So you will have to close the pull request manually. We are working on improving the workflow to address this.
 
 ### Running into problems?
diff --git a/README.md b/README.md
index d0a8c3a..c9828cb9 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@
 
 Note: The contributions workflow via GitHub is currently experimental - only contributions to the following projects are being accepted at this time:
 * [Activity](activity)
+* [Biometric](biometric)
 * [Fragment](fragment)
 * [Navigation](navigation)
 * [Paging](paging)
@@ -55,14 +56,14 @@
 3. Create a directory for your checkout (it can be any name)
 
 ```bash
-mkdir androidx-master-dev
-cd androidx-master-dev
+mkdir androidx-main
+cd androidx-main
 ```
 
 4. Use `repo` command to initialize the repository.
 
 ```bash
-repo init -u https://android.googlesource.com/platform/manifest -b androidx-master-dev --partial-clone --clone-filter=blob:limit=10M
+repo init -u https://android.googlesource.com/platform/manifest -b androidx-main --partial-clone --clone-filter=blob:limit=10M
 ```
 
 5. Now your repository is set to pull only what you need for building and running AndroidX libraries. Download the code (and grab a coffee while we pull down the files):
@@ -113,7 +114,7 @@
 ```
 
 ### Continuous integration
-[Our continuous integration system](https://ci.android.com/builds/branches/aosp-androidx-master-dev/grid?) builds all in progress (and potentially unstable) libraries as new changes are merged. You can manually download these AARs and JARs for your experimentation.
+[Our continuous integration system](https://ci.android.com/builds/branches/aosp-androidx-main/grid?) builds all in progress (and potentially unstable) libraries as new changes are merged. You can manually download these AARs and JARs for your experimentation.
 
 ## Running Tests
 
diff --git a/activity/README.md b/activity/README.md
index 764187e..559daab 100644
--- a/activity/README.md
+++ b/activity/README.md
@@ -7,7 +7,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/activity)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/activity/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/activity/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/classes.html)
 
diff --git a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
index 3368985..2c20d93 100644
--- a/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
+++ b/activity/activity/src/main/java/androidx/activity/ComponentActivity.java
@@ -693,7 +693,9 @@
     public void reportFullyDrawn() {
         try {
             if (Trace.isEnabled()) {
-                Trace.beginSection("reportFullyDrawn() for " + getComponentName());
+                // TODO: Ideally we'd include getComponentName() (as later versions of platform
+                //  do), but b/175345114 needs to be addressed.
+                Trace.beginSection("reportFullyDrawn() for ComponentActivity");
             }
 
             if (Build.VERSION.SDK_INT > 19) {
diff --git a/annotation/annotation/README.md b/annotation/annotation/README.md
index e65290d..dab54a9 100644
--- a/annotation/annotation/README.md
+++ b/annotation/annotation/README.md
@@ -7,7 +7,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/annotation)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/annotation/annotation/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/annotation/annotation/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/classes.html)
 
diff --git a/appcompat/README.md b/appcompat/README.md
index 646e462..a0f70f9 100644
--- a/appcompat/README.md
+++ b/appcompat/README.md
@@ -4,7 +4,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/appcompat)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/appcompat/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/appcompat/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/classes.html)
 
diff --git a/appcompat/appcompat-resources/api/1.3.0-beta01.txt b/appcompat/appcompat-resources/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..b0256cf
--- /dev/null
+++ b/appcompat/appcompat-resources/api/1.3.0-beta01.txt
@@ -0,0 +1,35 @@
+// 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 android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    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;
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    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;
+    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);
+  }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/public_plus_experimental_1.3.0-beta01.txt b/appcompat/appcompat-resources/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..fdef64c
--- /dev/null
+++ b/appcompat/appcompat-resources/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,35 @@
+// 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 android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback androidx.core.graphics.drawable.TintAwareDrawable {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    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;
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    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;
+    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);
+  }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/res-1.3.0-beta01.txt b/appcompat/appcompat-resources/api/res-1.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/appcompat/appcompat-resources/api/res-1.3.0-beta01.txt
diff --git a/appcompat/appcompat-resources/api/restricted_1.3.0-beta01.txt b/appcompat/appcompat-resources/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..c13b344
--- /dev/null
+++ b/appcompat/appcompat-resources/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,90 @@
+// 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 android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback androidx.core.graphics.drawable.TintAwareDrawable {
+    ctor public AnimatedStateListDrawableCompat();
+    method public void addState(int[], android.graphics.drawable.Drawable, int);
+    method public void addState(int[]!, android.graphics.drawable.Drawable!);
+    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;
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+    method public int getOpacity();
+    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;
+    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);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableWrapper extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+    ctor public DrawableWrapper(android.graphics.drawable.Drawable!);
+    method public void draw(android.graphics.Canvas!);
+    method public int getOpacity();
+    method public android.graphics.drawable.Drawable! getWrappedDrawable();
+    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 setWrappedDrawable(android.graphics.drawable.Drawable!);
+    method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+  }
+
+}
+
+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 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 android.graphics.drawable.Drawable! getDrawable(int) throws android.content.res.Resources.NotFoundException;
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public static boolean shouldBeUsed();
+    field public static final int MAX_SDK_WHERE_REQUIRED = 20; // 0x14
+  }
+
+}
+
diff --git a/appcompat/appcompat/api/1.3.0-beta01.txt b/appcompat/appcompat/api/1.3.0-beta01.txt
new file mode 100644
index 0000000..6b91606
--- /dev/null
+++ b/appcompat/appcompat/api/1.3.0-beta01.txt
@@ -0,0 +1,981 @@
+// 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 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 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 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 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 android.app.Dialog 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();
+  }
+
+  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 protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+}
+
+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.core.view.TintableBackgroundView {
+    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 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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements 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 @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 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.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+    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 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 setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+    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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+    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 public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    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 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.core.view.TintableBackgroundView {
+    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 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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+    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 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 setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(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.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 @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 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.core.view.TintableBackgroundView {
+    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 void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  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 public int getBaselineAlignedChildIndex();
+    method public android.graphics.drawable.Drawable! getDividerDrawable();
+    method public int getDividerPadding();
+    method public int getGravity();
+    method public int getOrientation();
+    method public int getShowDividers();
+    method public float getWeightSum();
+    method public boolean isBaselineAligned();
+    method 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(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 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 public int getImeOptions();
+    method public int getInputType();
+    method public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    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 {
+    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 public boolean getShowText();
+    method public boolean getSplitTrack();
+    method public int getSwitchMinWidth();
+    method public int getSwitchPadding();
+    method public CharSequence! getTextOff();
+    method public CharSequence! getTextOn();
+    method public android.graphics.drawable.Drawable! getThumbDrawable();
+    method public int getThumbTextPadding();
+    method public android.content.res.ColorStateList? getThumbTintList();
+    method public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method public android.graphics.drawable.Drawable! getTrackDrawable();
+    method public android.content.res.ColorStateList? getTrackTintList();
+    method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public void onMeasure(int, int);
+    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 {
+    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 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 public CharSequence? getCollapseContentDescription();
+    method public android.graphics.drawable.Drawable? getCollapseIcon();
+    method public int getContentInsetEnd();
+    method public int getContentInsetEndWithActions();
+    method public int getContentInsetLeft();
+    method public int getContentInsetRight();
+    method public int getContentInsetStart();
+    method public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method public android.graphics.drawable.Drawable! getLogo();
+    method public CharSequence! getLogoDescription();
+    method public android.view.Menu! getMenu();
+    method public CharSequence? getNavigationContentDescription();
+    method public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public int getTitleMarginBottom();
+    method public int getTitleMarginEnd();
+    method public int getTitleMarginStart();
+    method public int getTitleMarginTop();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method public boolean isOverflowMenuShowing();
+    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.3.0-beta01.txt b/appcompat/appcompat/api/public_plus_experimental_1.3.0-beta01.txt
new file mode 100644
index 0000000..8886644
--- /dev/null
+++ b/appcompat/appcompat/api/public_plus_experimental_1.3.0-beta01.txt
@@ -0,0 +1,989 @@
+// 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.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 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 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 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 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 android.app.Dialog 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();
+  }
+
+  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 protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+}
+
+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.core.view.TintableBackgroundView {
+    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 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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView 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 @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 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.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+    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 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 setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+    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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+    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 public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  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?);
+  }
+
+  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?);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+    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 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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+    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 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 setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(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.core.widget.AutoSizeableTextView 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 @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 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.core.view.TintableBackgroundView {
+    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 void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  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 public int getBaselineAlignedChildIndex();
+    method public android.graphics.drawable.Drawable! getDividerDrawable();
+    method public int getDividerPadding();
+    method public int getGravity();
+    method public int getOrientation();
+    method public int getShowDividers();
+    method public float getWeightSum();
+    method public boolean isBaselineAligned();
+    method 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(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 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 public int getImeOptions();
+    method public int getInputType();
+    method public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    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 {
+    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 public boolean getShowText();
+    method public boolean getSplitTrack();
+    method public int getSwitchMinWidth();
+    method public int getSwitchPadding();
+    method public CharSequence! getTextOff();
+    method public CharSequence! getTextOn();
+    method public android.graphics.drawable.Drawable! getThumbDrawable();
+    method public int getThumbTextPadding();
+    method public android.content.res.ColorStateList? getThumbTintList();
+    method public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method public android.graphics.drawable.Drawable! getTrackDrawable();
+    method public android.content.res.ColorStateList? getTrackTintList();
+    method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public void onMeasure(int, int);
+    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 {
+    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 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 public CharSequence? getCollapseContentDescription();
+    method public android.graphics.drawable.Drawable? getCollapseIcon();
+    method public int getContentInsetEnd();
+    method public int getContentInsetEndWithActions();
+    method public int getContentInsetLeft();
+    method public int getContentInsetRight();
+    method public int getContentInsetStart();
+    method public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method public android.graphics.drawable.Drawable! getLogo();
+    method public CharSequence! getLogoDescription();
+    method public android.view.Menu! getMenu();
+    method public CharSequence? getNavigationContentDescription();
+    method public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public int getTitleMarginBottom();
+    method public int getTitleMarginEnd();
+    method public int getTitleMarginStart();
+    method public int getTitleMarginTop();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(@MenuRes int);
+    method public boolean isOverflowMenuShowing();
+    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.3.0-beta01.txt b/appcompat/appcompat/api/res-1.3.0-beta01.txt
new file mode 100644
index 0000000..78975ff
--- /dev/null
+++ b/appcompat/appcompat/api/res-1.3.0-beta01.txt
@@ -0,0 +1,368 @@
+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 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.3.0-beta01.txt b/appcompat/appcompat/api/restricted_1.3.0-beta01.txt
new file mode 100644
index 0000000..7439cfd
--- /dev/null
+++ b/appcompat/appcompat/api/restricted_1.3.0-beta01.txt
@@ -0,0 +1,2206 @@
+// 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 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 @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 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 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 android.app.Dialog 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();
+  }
+
+  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 protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+  }
+
+  @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 androidx.appcompat.view.menu.MenuPopup getPopup();
+    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 @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setPresenter(androidx.appcompat.widget.ActionMenuPresenter!);
+    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 androidx.appcompat.widget.ActivityChooserModel! getDataModel();
+    method public boolean isShowingPopup();
+    method public void setActivityChooserModel(androidx.appcompat.widget.ActivityChooserModel!);
+    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?);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+    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 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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView 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 @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 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.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+    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 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 setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+    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 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();
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+    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 public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+    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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  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);
+  }
+
+  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?);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+    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 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 public void setTextAppearance(android.content.Context!, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+    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 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 setSupportButtonTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(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.core.widget.AutoSizeableTextView 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 @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 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.core.view.TintableBackgroundView {
+    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 void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(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);
+  }
+
+  @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 public int getBaselineAlignedChildIndex();
+    method public android.graphics.drawable.Drawable! getDividerDrawable();
+    method public int getDividerPadding();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getDividerWidth();
+    method public int getGravity();
+    method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode public int getOrientation();
+    method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode public int getShowDividers();
+    method public float getWeightSum();
+    method public boolean isBaselineAligned();
+    method 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(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 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 public int getImeOptions();
+    method public int getInputType();
+    method public int getMaxWidth();
+    method public CharSequence! getQuery();
+    method public CharSequence? getQueryHint();
+    method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+    method public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    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 {
+    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 public boolean getShowText();
+    method public boolean getSplitTrack();
+    method public int getSwitchMinWidth();
+    method public int getSwitchPadding();
+    method public CharSequence! getTextOff();
+    method public CharSequence! getTextOn();
+    method public android.graphics.drawable.Drawable! getThumbDrawable();
+    method public int getThumbTextPadding();
+    method public android.content.res.ColorStateList? getThumbTintList();
+    method public android.graphics.PorterDuff.Mode? getThumbTintMode();
+    method public android.graphics.drawable.Drawable! getTrackDrawable();
+    method public android.content.res.ColorStateList? getTrackTintList();
+    method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+    method public void onMeasure(int, int);
+    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 {
+    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 @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 public CharSequence? getCollapseContentDescription();
+    method public android.graphics.drawable.Drawable? getCollapseIcon();
+    method public int getContentInsetEnd();
+    method public int getContentInsetEndWithActions();
+    method public int getContentInsetLeft();
+    method public int getContentInsetRight();
+    method public int getContentInsetStart();
+    method public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method public android.graphics.drawable.Drawable! getLogo();
+    method public CharSequence! getLogoDescription();
+    method public android.view.Menu! getMenu();
+    method public CharSequence? getNavigationContentDescription();
+    method public android.graphics.drawable.Drawable? getNavigationIcon();
+    method public android.graphics.drawable.Drawable? getOverflowIcon();
+    method public int getPopupTheme();
+    method public CharSequence! getSubtitle();
+    method public CharSequence! getTitle();
+    method public int getTitleMarginBottom();
+    method public int getTitleMarginEnd();
+    method public int getTitleMarginStart();
+    method 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 @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 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 setMenu(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.widget.ActionMenuPresenter!);
+    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/appsearch/appsearch/api/current.txt b/appsearch/appsearch/api/current.txt
index 32a70b4..7e4001e 100644
--- a/appsearch/appsearch/api/current.txt
+++ b/appsearch/appsearch/api/current.txt
@@ -266,7 +266,7 @@
   public static final class SetSchemaRequest.Builder {
     ctor public SetSchemaRequest.Builder();
     method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(Class<?>!...) throws androidx.appsearch.exceptions.AppSearchException;
-    method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(java.util.Collection<java.lang.Class<?>!>) throws androidx.appsearch.exceptions.AppSearchException;
+    method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(java.util.Collection<? extends java.lang.Class<?>>) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.SetSchemaRequest.Builder addSchema(androidx.appsearch.app.AppSearchSchema!...);
     method public androidx.appsearch.app.SetSchemaRequest.Builder addSchema(java.util.Collection<androidx.appsearch.app.AppSearchSchema!>);
     method public androidx.appsearch.app.SetSchemaRequest build();
diff --git a/appsearch/appsearch/api/public_plus_experimental_current.txt b/appsearch/appsearch/api/public_plus_experimental_current.txt
index 32a70b4..7e4001e 100644
--- a/appsearch/appsearch/api/public_plus_experimental_current.txt
+++ b/appsearch/appsearch/api/public_plus_experimental_current.txt
@@ -266,7 +266,7 @@
   public static final class SetSchemaRequest.Builder {
     ctor public SetSchemaRequest.Builder();
     method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(Class<?>!...) throws androidx.appsearch.exceptions.AppSearchException;
-    method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(java.util.Collection<java.lang.Class<?>!>) throws androidx.appsearch.exceptions.AppSearchException;
+    method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(java.util.Collection<? extends java.lang.Class<?>>) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.SetSchemaRequest.Builder addSchema(androidx.appsearch.app.AppSearchSchema!...);
     method public androidx.appsearch.app.SetSchemaRequest.Builder addSchema(java.util.Collection<androidx.appsearch.app.AppSearchSchema!>);
     method public androidx.appsearch.app.SetSchemaRequest build();
diff --git a/appsearch/appsearch/api/restricted_current.txt b/appsearch/appsearch/api/restricted_current.txt
index 32a70b4..7e4001e 100644
--- a/appsearch/appsearch/api/restricted_current.txt
+++ b/appsearch/appsearch/api/restricted_current.txt
@@ -266,7 +266,7 @@
   public static final class SetSchemaRequest.Builder {
     ctor public SetSchemaRequest.Builder();
     method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(Class<?>!...) throws androidx.appsearch.exceptions.AppSearchException;
-    method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(java.util.Collection<java.lang.Class<?>!>) throws androidx.appsearch.exceptions.AppSearchException;
+    method public androidx.appsearch.app.SetSchemaRequest.Builder addDataClass(java.util.Collection<? extends java.lang.Class<?>>) throws androidx.appsearch.exceptions.AppSearchException;
     method public androidx.appsearch.app.SetSchemaRequest.Builder addSchema(androidx.appsearch.app.AppSearchSchema!...);
     method public androidx.appsearch.app.SetSchemaRequest.Builder addSchema(java.util.Collection<androidx.appsearch.app.AppSearchSchema!>);
     method public androidx.appsearch.app.SetSchemaRequest build();
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorTest.java
index bb81bfd..338f2a8 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/AnnotationProcessorTest.java
@@ -27,7 +27,6 @@
 import android.content.Context;
 
 import androidx.appsearch.annotation.AppSearchDocument;
-import androidx.appsearch.app.util.AppSearchTestUtils;
 import androidx.appsearch.localstorage.LocalStorage;
 import androidx.test.core.app.ApplicationProvider;
 
@@ -41,20 +40,30 @@
 
 public class AnnotationProcessorTest {
     private AppSearchSession mSession;
+    private static final String DB_NAME_1 = LocalStorage.DEFAULT_DATABASE_NAME;
 
     @Before
     public void setUp() throws Exception {
         Context context = ApplicationProvider.getApplicationContext();
-        AppSearchTestUtils.cleanup(context);
 
         mSession = checkIsResultSuccess(LocalStorage.createSearchSession(
                 new LocalStorage.SearchContext.Builder(context)
-                        .setDatabaseName(AppSearchTestUtils.DB_1).build()));
+                        .setDatabaseName(DB_NAME_1).build()));
+
+        // Cleanup whatever documents may still exist in these databases. This is needed in
+        // addition to tearDown in case a test exited without completing properly.
+        cleanup();
     }
 
     @After
     public void tearDown() throws Exception {
-        AppSearchTestUtils.cleanup(ApplicationProvider.getApplicationContext());
+        // Cleanup whatever documents may still exist in these databases.
+        cleanup();
+    }
+
+    private void cleanup() throws Exception {
+        checkIsResultSuccess(mSession.setSchema(
+                new SetSchemaRequest.Builder().setForceOverride(true).build()));
     }
 
     @AppSearchDocument
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SetSchemaRequestTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SetSchemaRequestTest.java
index 746216d..5b5cf28 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SetSchemaRequestTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SetSchemaRequestTest.java
@@ -26,9 +26,13 @@
 import androidx.appsearch.annotation.AppSearchDocument;
 import androidx.collection.ArrayMap;
 
+import com.google.common.collect.ImmutableSet;
+
 import org.junit.Test;
 
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -38,6 +42,7 @@
     static class Card {
         @AppSearchDocument.Uri
         String mUri;
+
         @AppSearchDocument.Property
                 (indexingType = INDEXING_TYPE_PREFIXES, tokenizerType = TOKENIZER_TYPE_PLAIN)
         String mString;
@@ -56,6 +61,36 @@
         }
     }
 
+    static class Spade {}
+
+    @AppSearchDocument
+    static class King extends Spade {
+        @AppSearchDocument.Uri
+        String mUri;
+
+        @AppSearchDocument.Property
+                (indexingType = INDEXING_TYPE_PREFIXES, tokenizerType = TOKENIZER_TYPE_PLAIN)
+        String mString;
+    }
+
+    @AppSearchDocument
+    static class Queen extends Spade {
+        @AppSearchDocument.Uri
+        String mUri;
+
+        @AppSearchDocument.Property
+                (indexingType = INDEXING_TYPE_PREFIXES, tokenizerType = TOKENIZER_TYPE_PLAIN)
+        String mString;
+    }
+
+    private static Collection<String> getSchemaTypesFromSetSchemaRequest(SetSchemaRequest request) {
+        HashSet<String> schemaTypes = new HashSet<>();
+        for (AppSearchSchema schema : request.getSchemas()) {
+            schemaTypes.add(schema.getSchemaType());
+        }
+        return schemaTypes;
+    }
+
     @Test
     public void testInvalidSchemaReferences_fromSystemUiVisibility() {
         IllegalArgumentException expected = assertThrows(IllegalArgumentException.class,
@@ -274,4 +309,24 @@
         // Nothing should be visible.
         assertThat(request.getSchemasPackageAccessible()).isEmpty();
     }
+
+    @Test
+    public void testAddDataClass_byCollection() throws Exception {
+        Set<Class<? extends Spade>> cardClasses = ImmutableSet.of(Queen.class, King.class);
+        SetSchemaRequest request =
+                new SetSchemaRequest.Builder().addDataClass(cardClasses)
+                        .build();
+        assertThat(getSchemaTypesFromSetSchemaRequest(request)).containsExactly("Queen",
+                "King");
+    }
+
+    @Test
+    public void testAddDataClass_byCollectionWithSeparateCalls() throws
+            Exception {
+        SetSchemaRequest request =
+                new SetSchemaRequest.Builder().addDataClass(ImmutableSet.of(Queen.class))
+                        .addDataClass(ImmutableSet.of(King.class)).build();
+        assertThat(getSchemaTypesFromSetSchemaRequest(request)).containsExactly("Queen",
+                "King");
+    }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/AppSearchSessionCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/AppSearchSessionCtsTest.java
index 1caa06f..32738eb 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/AppSearchSessionCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/AppSearchSessionCtsTest.java
@@ -40,7 +40,6 @@
 import androidx.appsearch.app.SearchSpec;
 import androidx.appsearch.app.SetSchemaRequest;
 import androidx.appsearch.app.cts.customer.EmailDataClass;
-import androidx.appsearch.app.util.AppSearchTestUtils;
 import androidx.appsearch.localstorage.LocalStorage;
 import androidx.test.core.app.ApplicationProvider;
 
@@ -55,26 +54,37 @@
 
 public class AppSearchSessionCtsTest {
     private AppSearchSession mDb1;
-    private final String mDbName1 = AppSearchTestUtils.DEFAULT_DATABASE;
+    private static final String DB_NAME_1 = LocalStorage.DEFAULT_DATABASE_NAME;
     private AppSearchSession mDb2;
-    private final String mDbName2 = AppSearchTestUtils.DB_2;
+    private static final String DB_NAME_2 = "testDb2";
 
     @Before
     public void setUp() throws Exception {
         Context context = ApplicationProvider.getApplicationContext();
-        AppSearchTestUtils.cleanup(context);
 
         mDb1 = checkIsResultSuccess(LocalStorage.createSearchSession(
                 new LocalStorage.SearchContext.Builder(context)
-                        .setDatabaseName(mDbName1).build()));
+                        .setDatabaseName(DB_NAME_1).build()));
         mDb2 = checkIsResultSuccess(LocalStorage.createSearchSession(
                 new LocalStorage.SearchContext.Builder(context)
-                        .setDatabaseName(mDbName2).build()));
+                        .setDatabaseName(DB_NAME_2).build()));
+
+        // Cleanup whatever documents may still exist in these databases. This is needed in
+        // addition to tearDown in case a test exited without completing properly.
+        cleanup();
     }
 
     @After
     public void tearDown() throws Exception {
-        AppSearchTestUtils.cleanup(ApplicationProvider.getApplicationContext());
+        // Cleanup whatever documents may still exist in these databases.
+        cleanup();
+    }
+
+    private void cleanup() throws Exception {
+        checkIsResultSuccess(mDb1.setSchema(
+                new SetSchemaRequest.Builder().setForceOverride(true).build()));
+        checkIsResultSuccess(mDb2.setSchema(
+                new SetSchemaRequest.Builder().setForceOverride(true).build()));
     }
 
     @Test
@@ -290,7 +300,7 @@
         assertThat(failResult1.getErrorMessage()).contains("Schema is incompatible");
         assertThat(failResult1.getErrorMessage())
                 .contains(
-                        "Deleted types: [androidx.appsearch.test$" + mDbName1 + "/builtin:Email]");
+                        "Deleted types: [androidx.appsearch.test$" + DB_NAME_1 + "/builtin:Email]");
 
         // Try to remove the email schema again, which should now work as we set forceOverride to
         // be true.
@@ -316,7 +326,7 @@
                 new PutDocumentsRequest.Builder().addGenericDocument(email2).build()).get();
         assertThat(failResult2.isSuccess()).isFalse();
         assertThat(failResult2.getFailures().get("email2").getErrorMessage())
-                .isEqualTo("Schema type config 'androidx.appsearch.test$" + mDbName1
+                .isEqualTo("Schema type config 'androidx.appsearch.test$" + DB_NAME_1
                         + "/builtin:Email' not found");
     }
 
@@ -371,7 +381,7 @@
         assertThat(failResult1.getErrorMessage()).contains("Schema is incompatible");
         assertThat(failResult1.getErrorMessage())
                 .contains(
-                        "Deleted types: [androidx.appsearch.test$" + mDbName1 + "/builtin:Email]");
+                        "Deleted types: [androidx.appsearch.test$" + DB_NAME_1 + "/builtin:Email]");
 
         // Try to remove the email schema again, which should now work as we set forceOverride to
         // be true.
@@ -395,7 +405,7 @@
                 new PutDocumentsRequest.Builder().addGenericDocument(email3).build()).get();
         assertThat(failResult2.isSuccess()).isFalse();
         assertThat(failResult2.getFailures().get("email3").getErrorMessage())
-                .isEqualTo("Schema type config 'androidx.appsearch.test$" + mDbName1
+                .isEqualTo("Schema type config 'androidx.appsearch.test$" + DB_NAME_1
                         + "/builtin:Email' not found");
 
         // Make sure email in database 2 still present.
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GlobalSearchSessionCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GlobalSearchSessionCtsTest.java
index ad77545..40a6a60 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GlobalSearchSessionCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/cts/GlobalSearchSessionCtsTest.java
@@ -35,49 +35,91 @@
 import androidx.appsearch.app.SearchResults;
 import androidx.appsearch.app.SearchSpec;
 import androidx.appsearch.app.SetSchemaRequest;
-import androidx.appsearch.app.util.AppSearchTestUtils;
 import androidx.appsearch.localstorage.LocalStorage;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.google.common.collect.ImmutableList;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.util.ArrayList;
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.List;
-import java.util.Set;
 
 public class GlobalSearchSessionCtsTest {
     private AppSearchSession mDb1;
+    private static final String DB_NAME_1 = LocalStorage.DEFAULT_DATABASE_NAME;
     private AppSearchSession mDb2;
+    private static final String DB_NAME_2 = "testDb2";
 
     private GlobalSearchSession mGlobalAppSearchManager;
 
     @Before
     public void setUp() throws Exception {
         Context context = ApplicationProvider.getApplicationContext();
-        AppSearchTestUtils.cleanup(context);
 
         mDb1 = checkIsResultSuccess(LocalStorage.createSearchSession(
                 new LocalStorage.SearchContext.Builder(context)
-                        .setDatabaseName(AppSearchTestUtils.DEFAULT_DATABASE).build()));
+                        .setDatabaseName(DB_NAME_1).build()));
         mDb2 = checkIsResultSuccess(LocalStorage.createSearchSession(
                 new LocalStorage.SearchContext.Builder(context)
-                        .setDatabaseName(AppSearchTestUtils.DB_2).build()));
+                        .setDatabaseName(DB_NAME_2).build()));
+
+        // Cleanup whatever documents may still exist in these databases. This is needed in
+        // addition to tearDown in case a test exited without completing properly.
+        cleanup();
 
         mGlobalAppSearchManager = checkIsResultSuccess(LocalStorage.createGlobalSearchSession(
                 new LocalStorage.GlobalSearchContext.Builder(context).build()));
-
     }
 
     @After
     public void tearDown() throws Exception {
-        AppSearchTestUtils.cleanup(ApplicationProvider.getApplicationContext());
+        // Cleanup whatever documents may still exist in these databases.
+        cleanup();
+    }
+
+    private void cleanup() throws Exception {
+        checkIsResultSuccess(mDb1.setSchema(
+                new SetSchemaRequest.Builder().setForceOverride(true).build()));
+        checkIsResultSuccess(mDb2.setSchema(
+                new SetSchemaRequest.Builder().setForceOverride(true).build()));
+    }
+
+    private List<GenericDocument> snapshotResults(String queryExpression, SearchSpec spec)
+            throws Exception {
+        SearchResults searchResults = mGlobalAppSearchManager.query(queryExpression, spec);
+        return convertSearchResultsToDocuments(searchResults);
+    }
+
+    /**
+     * Asserts that the union of {@code addedDocuments} and {@code beforeDocuments} is exactly
+     * equivalent to {@code afterDocuments}. Order doesn't matter.
+     *
+     * @param beforeDocuments Documents that existed first.
+     * @param afterDocuments  The total collection of documents that should exist now.
+     * @param addedDocuments  The collection of documents that were expected to be added.
+     */
+    private void assertAddedBetweenSnapshots(List<? extends GenericDocument> beforeDocuments,
+            List<? extends GenericDocument> afterDocuments,
+            List<? extends GenericDocument> addedDocuments) throws Exception {
+        List<GenericDocument> expectedDocuments = new ArrayList<>(beforeDocuments);
+        expectedDocuments.addAll(addedDocuments);
+        assertThat(afterDocuments).containsExactlyElementsIn(expectedDocuments);
     }
 
     @Test
     public void testGlobalQuery_oneInstance() throws Exception {
+        // Snapshot what documents may already exist on the device.
+        SearchSpec exactSearchSpec = new SearchSpec.Builder()
+                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                .build();
+        List<GenericDocument> beforeBodyDocuments = snapshotResults("body", exactSearchSpec);
+        List<GenericDocument> beforeBodyEmailDocuments = snapshotResults("body email",
+                exactSearchSpec);
+
         // Schema registration
         checkIsResultSuccess(mDb1.setSchema(
                 new SetSchemaRequest.Builder().addSchema(AppSearchEmail.SCHEMA).build()));
@@ -94,24 +136,25 @@
                 new PutDocumentsRequest.Builder().addGenericDocument(inEmail).build()));
 
         // Query for the document
-        SearchResults searchResults = mGlobalAppSearchManager.query("body",
-                new SearchSpec.Builder()
-                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                        .build());
-        List<GenericDocument> documents = convertSearchResultsToDocuments(searchResults);
-        assertThat(documents).hasSize(1);
-        assertThat(documents).containsExactly(inEmail);
+        List<GenericDocument> afterBodyDocuments = snapshotResults("body", exactSearchSpec);
+        assertAddedBetweenSnapshots(beforeBodyDocuments, afterBodyDocuments,
+                Collections.singletonList(inEmail));
 
         // Multi-term query
-        searchResults = mGlobalAppSearchManager.query("body email", new SearchSpec.Builder()
-                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                .build());
-        documents = convertSearchResultsToDocuments(searchResults);
-        assertThat(documents).containsExactly(inEmail);
+        List<GenericDocument> afterBodyEmailDocuments = snapshotResults("body email",
+                exactSearchSpec);
+        assertAddedBetweenSnapshots(beforeBodyEmailDocuments, afterBodyEmailDocuments,
+                Collections.singletonList(inEmail));
     }
 
     @Test
     public void testGlobalQuery_twoInstances() throws Exception {
+        // Snapshot what documents may already exist on the device.
+        SearchSpec exactSearchSpec = new SearchSpec.Builder()
+                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                .build();
+        List<GenericDocument> beforeBodyDocuments = snapshotResults("body", exactSearchSpec);
+
         // Schema registration
         checkIsResultSuccess(mDb1.setSchema(new SetSchemaRequest.Builder()
                 .addSchema(AppSearchEmail.SCHEMA).build()));
@@ -141,20 +184,23 @@
                 new PutDocumentsRequest.Builder().addGenericDocument(inEmail2).build()));
 
         // Query across all instances
-        SearchResults searchResults = mGlobalAppSearchManager.query("body",
-                new SearchSpec.Builder()
-                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                        .build());
-        List<GenericDocument> documents = convertSearchResultsToDocuments(searchResults);
-        assertThat(documents).containsExactly(inEmail1, inEmail2);
+        List<GenericDocument> afterBodyDocuments = snapshotResults("body", exactSearchSpec);
+        assertAddedBetweenSnapshots(beforeBodyDocuments, afterBodyDocuments,
+                ImmutableList.of(inEmail1, inEmail2));
     }
 
     @Test
     public void testGlobalQuery_getNextPage() throws Exception {
+        // Snapshot what documents may already exist on the device.
+        SearchSpec exactSearchSpec = new SearchSpec.Builder()
+                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                .build();
+        List<GenericDocument> beforeBodyDocuments = snapshotResults("body", exactSearchSpec);
+
         // Schema registration
         checkIsResultSuccess(mDb1.setSchema(
                 new SetSchemaRequest.Builder().addSchema(AppSearchEmail.SCHEMA).build()));
-        Set<AppSearchEmail> emailSet = new HashSet<>();
+        List<AppSearchEmail> emailList = new ArrayList<>();
         PutDocumentsRequest.Builder putDocumentsRequestBuilder = new PutDocumentsRequest.Builder();
 
         // Index 31 documents
@@ -166,16 +212,17 @@
                             .setSubject("testPut example")
                             .setBody("This is the body of the testPut email")
                             .build();
-            emailSet.add(inEmail);
+            emailList.add(inEmail);
             putDocumentsRequestBuilder.addGenericDocument(inEmail);
         }
         checkIsBatchResultSuccess(mDb1.putDocuments(putDocumentsRequestBuilder.build()));
 
         // Set number of results per page is 7.
+        int pageSize = 7;
         SearchResults searchResults = mGlobalAppSearchManager.query("body",
                 new SearchSpec.Builder()
                         .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                        .setResultCountPerPage(7)
+                        .setResultCountPerPage(pageSize)
                         .build());
         List<GenericDocument> documents = new ArrayList<>();
 
@@ -192,12 +239,31 @@
         } while (results.size() > 0);
 
         // check all document presents
-        assertThat(documents).containsExactlyElementsIn(emailSet);
-        assertThat(pageNumber).isEqualTo(6); // 5 (upper(31/7)) + 1 (final empty page)
+        assertAddedBetweenSnapshots(beforeBodyDocuments, documents, emailList);
+
+        int totalDocuments = beforeBodyDocuments.size() + documents.size();
+
+        // +1 for final empty page
+        int expectedPages = (int) Math.ceil(totalDocuments * 1.0 / pageSize) + 1;
+        assertThat(pageNumber).isEqualTo(expectedPages);
     }
 
     @Test
     public void testGlobalQuery_acrossTypes() throws Exception {
+        // Snapshot what documents may already exist on the device.
+        SearchSpec exactSearchSpec = new SearchSpec.Builder()
+                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                .build();
+        List<GenericDocument> beforeBodyDocuments = snapshotResults("body", exactSearchSpec);
+
+        SearchSpec exactEmailSearchSpec =
+                new SearchSpec.Builder()
+                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                        .addSchemaType(AppSearchEmail.SCHEMA_TYPE)
+                        .build();
+        List<GenericDocument> beforeBodyEmailDocuments = snapshotResults("body",
+                exactEmailSearchSpec);
+
         // Schema registration
         AppSearchSchema genericSchema = new AppSearchSchema.Builder("Generic")
                 .addProperty(new PropertyConfig.Builder("foo")
@@ -239,24 +305,33 @@
                 new PutDocumentsRequest.Builder().addGenericDocument(email).build()));
 
         // Query for all documents across types
-        SearchResults searchResults = mGlobalAppSearchManager.query("body",
-                new SearchSpec.Builder()
-                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                        .build());
-        List<GenericDocument> documents = convertSearchResultsToDocuments(searchResults);
-        assertThat(documents).containsExactly(genericDocument, email, email);
+        List<GenericDocument> afterBodyDocuments = snapshotResults("body", exactSearchSpec);
+        assertAddedBetweenSnapshots(beforeBodyDocuments, afterBodyDocuments,
+                ImmutableList.of(genericDocument, email, email));
 
         // Query only for email documents
-        searchResults = mGlobalAppSearchManager.query("body", new SearchSpec.Builder()
-                .addSchemaType(AppSearchEmail.SCHEMA_TYPE)
-                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                .build());
-        documents = convertSearchResultsToDocuments(searchResults);
-        assertThat(documents).containsExactly(email, email);
+        List<GenericDocument> afterBodyEmailDocuments = snapshotResults("body",
+                exactEmailSearchSpec);
+        assertAddedBetweenSnapshots(beforeBodyEmailDocuments, afterBodyEmailDocuments,
+                ImmutableList.of(email, email));
     }
 
     @Test
     public void testGlobalQuery_namespaceFilter() throws Exception {
+        // Snapshot what documents may already exist on the device.
+        SearchSpec exactSearchSpec = new SearchSpec.Builder()
+                .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                .build();
+        List<GenericDocument> beforeBodyDocuments = snapshotResults("body", exactSearchSpec);
+
+        SearchSpec exactNamespace1SearchSpec =
+                new SearchSpec.Builder()
+                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
+                        .addNamespace("namespace1")
+                        .build();
+        List<GenericDocument> beforeBodyNamespace1Documents = snapshotResults("body",
+                exactNamespace1SearchSpec);
+
         // Schema registration
         checkIsResultSuccess(mDb1.setSchema(new SetSchemaRequest.Builder()
                 .addSchema(AppSearchEmail.SCHEMA).build()));
@@ -288,20 +363,14 @@
                 new PutDocumentsRequest.Builder().addGenericDocument(document2).build()));
 
         // Query for all namespaces
-        SearchResults searchResults = mGlobalAppSearchManager.query("body",
-                new SearchSpec.Builder()
-                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                        .build());
-        List<GenericDocument> documents = convertSearchResultsToDocuments(searchResults);
-        assertThat(documents).containsExactly(document1, document2);
+        List<GenericDocument> afterBodyDocuments = snapshotResults("body", exactSearchSpec);
+        assertAddedBetweenSnapshots(beforeBodyDocuments, afterBodyDocuments,
+                ImmutableList.of(document1, document2));
 
         // Query only for "namespace1"
-        searchResults = mGlobalAppSearchManager.query("body",
-                new SearchSpec.Builder()
-                        .addNamespace("namespace1")
-                        .setTermMatch(SearchSpec.TERM_MATCH_EXACT_ONLY)
-                        .build());
-        documents = convertSearchResultsToDocuments(searchResults);
-        assertThat(documents).containsExactly(document1);
+        List<GenericDocument> afterBodyNamespace1Documents = snapshotResults("body",
+                exactNamespace1SearchSpec);
+        assertAddedBetweenSnapshots(beforeBodyNamespace1Documents, afterBodyNamespace1Documents,
+                ImmutableList.of(document1));
     }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/util/AppSearchTestUtils.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/util/AppSearchTestUtils.java
index 0c2a856..fe176c8 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/util/AppSearchTestUtils.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/util/AppSearchTestUtils.java
@@ -18,8 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.content.Context;
-
 import androidx.appsearch.app.AppSearchBatchResult;
 import androidx.appsearch.app.AppSearchResult;
 import androidx.appsearch.app.AppSearchSession;
@@ -27,10 +25,6 @@
 import androidx.appsearch.app.GetByUriRequest;
 import androidx.appsearch.app.SearchResult;
 import androidx.appsearch.app.SearchResults;
-import androidx.appsearch.app.SetSchemaRequest;
-import androidx.appsearch.localstorage.LocalStorage;
-
-import com.google.common.collect.ImmutableList;
 
 import junit.framework.AssertionFailedError;
 
@@ -40,24 +34,6 @@
 
 public class AppSearchTestUtils {
 
-    // List of databases that may be used in tests. Keeping them in a centralized location helps
-    // #cleanup know which databases to clear.
-    public static final String DEFAULT_DATABASE = LocalStorage.DEFAULT_DATABASE_NAME;
-    public static final String DB_1 = "testDb1";
-    public static final String DB_2 = "testDb2";
-
-    public static void cleanup(Context context) throws Exception {
-        List<String> databases = ImmutableList.of(DEFAULT_DATABASE, DB_1, DB_2);
-        for (String database : databases) {
-            AppSearchSession session =
-                    checkIsResultSuccess(
-                            LocalStorage.createSearchSession(new LocalStorage.SearchContext.Builder(
-                                    context).setDatabaseName(database).build()));
-            checkIsResultSuccess(session.setSchema(
-                    new SetSchemaRequest.Builder().setForceOverride(true).build()));
-        }
-    }
-
     public static <V> V checkIsResultSuccess(Future<AppSearchResult<V>> future) throws Exception {
         AppSearchResult<V> result = future.get();
         if (!result.isSuccess()) {
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java
index 04be1e0..99786bd 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SetSchemaRequest.java
@@ -175,7 +175,7 @@
          */
         @SuppressLint("MissingGetterMatchingBuilder")  // Merged list available from getSchemas()
         @NonNull
-        public Builder addDataClass(@NonNull Collection<Class<?>> dataClasses)
+        public Builder addDataClass(@NonNull Collection<? extends Class<?>> dataClasses)
                 throws AppSearchException {
             Preconditions.checkState(!mBuilt, "Builder has already been used");
             Preconditions.checkNotNull(dataClasses);
diff --git a/appsearch/local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java b/appsearch/local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
index 4bdae11..92e2f7c 100644
--- a/appsearch/local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
+++ b/appsearch/local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
@@ -73,6 +73,8 @@
                 SchemaToProtoConverter.toSchemaTypeConfigProto(rewrittenVisibilitySchema.build());
     }
 
+    //TODO(b/175430168) add test to verify reset is working properly.
+
     /**
      * Ensure that we can rewrite an incoming schema type by adding the database as a prefix. While
      * also keeping any other existing schema types that may already be part of Icing's persisted
diff --git a/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java b/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
index 5018664..627e87a 100644
--- a/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
+++ b/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
@@ -162,7 +162,6 @@
     }
 
     private AppSearchImpl(@NonNull File icingDir) throws AppSearchException {
-        boolean isReset = false;
         mReadWriteLock.writeLock().lock();
 
         try {
@@ -172,9 +171,11 @@
                     .setBaseDir(icingDir.getAbsolutePath()).build();
             mIcingSearchEngineLocked = new IcingSearchEngine(options);
 
+            mVisibilityStoreLocked = new VisibilityStore(this);
+
             InitializeResultProto initializeResultProto = mIcingSearchEngineLocked.initialize();
-            SchemaProto schemaProto = null;
-            GetAllNamespacesResultProto getAllNamespacesResultProto = null;
+            SchemaProto schemaProto;
+            GetAllNamespacesResultProto getAllNamespacesResultProto;
             try {
                 checkSuccess(initializeResultProto.getStatus());
                 schemaProto = getSchemaProtoLocked();
@@ -184,7 +185,7 @@
                 Log.w(TAG, "Error initializing, resetting IcingSearchEngine.", e);
                 // Some error. Reset and see if it fixes it.
                 reset();
-                isReset = true;
+                return;
             }
 
             // Populate schema map
@@ -202,11 +203,8 @@
 
             // TODO(b/155939114): It's possible to optimize after init, which would reduce the time
             //   to when we're able to serve queries. Consider moving this optimize call out.
-            if (!isReset) {
-                checkForOptimizeLocked(/* force= */ true);
-            }
+            checkForOptimizeLocked(/* force= */ true);
 
-            mVisibilityStoreLocked = new VisibilityStore(this);
         } finally {
             mReadWriteLock.writeLock().unlock();
         }
@@ -632,6 +630,9 @@
     /**
      * Clears documents and schema across all packages and databaseNames.
      *
+     * <p>This method also clear all data in {@link VisibilityStore}, an
+     * {@link #initializeVisibilityStore()} must be called after this.
+     *
      * <p>This method belongs to mutate group.
      *
      * @throws AppSearchException on IcingSearchEngine error.
diff --git a/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/VisibilityStore.java b/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/VisibilityStore.java
index b976291..186cf93 100644
--- a/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/VisibilityStore.java
+++ b/appsearch/local-storage/src/main/java/androidx/appsearch/localstorage/VisibilityStore.java
@@ -206,14 +206,12 @@
     }
 
     /**
-     * Handles an {@link AppSearchImpl#reset()} by clearing any cached state and resetting to a
-     * first-initialized state.
+     * Handles an {@code AppSearchImpl#reset()} by clearing any cached state.
      *
-     * @throws AppSearchException on AppSearchImpl error.
+     * <p> {@link #initialize()} must be called after this.
      */
-    public void handleReset() throws AppSearchException {
+    void handleReset() {
         mNotPlatformSurfaceableMap.clear();
-        initialize();
     }
 
     /**
diff --git a/benchmark/integration-tests/crystalball-experiment/src/scripts/copy_crystalball_prebuilts.py b/benchmark/integration-tests/crystalball-experiment/src/scripts/copy_crystalball_prebuilts.py
index 1102366..e3880a7 100755
--- a/benchmark/integration-tests/crystalball-experiment/src/scripts/copy_crystalball_prebuilts.py
+++ b/benchmark/integration-tests/crystalball-experiment/src/scripts/copy_crystalball_prebuilts.py
@@ -13,7 +13,7 @@
 def main():
     parser = argparse.ArgumentParser(description='Copy Crystalball Prebuilts')
     parser.add_argument('soong_path', action="store", help='Looks like "/usr/local/google/home/rahulrav/Workspace/internal_android/out/soong/.intermediates"')
-    parser.add_argument('prebuilts_directory', action="store", help='Looks like "/mnt/Android/Flatfoot/androidx_master/prebuilts/androidx/external/com/android/"')
+    parser.add_argument('prebuilts_directory', action="store", help='Looks like "/mnt/Android/Flatfoot/androidx_main/prebuilts/androidx/external/com/android/"')
     parser.add_argument('--verbose', action="store_true", default=False)
     parse_result = parser.parse_args()
 
diff --git a/biometric/.idea/codeStyles/Project.xml b/biometric/.idea/codeStyles/Project.xml
new file mode 120000
index 0000000..b52b28c
--- /dev/null
+++ b/biometric/.idea/codeStyles/Project.xml
@@ -0,0 +1 @@
+../../../.idea/codeStyles/Project.xml
\ No newline at end of file
diff --git a/biometric/.idea/codeStyles/codeStyleConfig.xml b/biometric/.idea/codeStyles/codeStyleConfig.xml
new file mode 120000
index 0000000..19c4848
--- /dev/null
+++ b/biometric/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1 @@
+../../../.idea/codeStyles/codeStyleConfig.xml
\ No newline at end of file
diff --git a/biometric/.idea/copyright/AndroidCopyright.xml b/biometric/.idea/copyright/AndroidCopyright.xml
new file mode 120000
index 0000000..afbbd04
--- /dev/null
+++ b/biometric/.idea/copyright/AndroidCopyright.xml
@@ -0,0 +1 @@
+../../../.idea/copyright/AndroidCopyright.xml
\ No newline at end of file
diff --git a/biometric/.idea/copyright/profiles_settings.xml b/biometric/.idea/copyright/profiles_settings.xml
new file mode 120000
index 0000000..5996ccd
--- /dev/null
+++ b/biometric/.idea/copyright/profiles_settings.xml
@@ -0,0 +1 @@
+../../../.idea/copyright/profiles_settings.xml
\ No newline at end of file
diff --git a/biometric/.idea/inspectionProfiles/Project_Default.xml b/biometric/.idea/inspectionProfiles/Project_Default.xml
new file mode 120000
index 0000000..a7481f4
--- /dev/null
+++ b/biometric/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1 @@
+../../../.idea/inspectionProfiles/Project_Default.xml
\ No newline at end of file
diff --git a/biometric/.idea/scopes/Ignore_API_Files.xml b/biometric/.idea/scopes/Ignore_API_Files.xml
new file mode 120000
index 0000000..3361ee1
--- /dev/null
+++ b/biometric/.idea/scopes/Ignore_API_Files.xml
@@ -0,0 +1 @@
+../../../.idea/scopes/Ignore_API_Files.xml
\ No newline at end of file
diff --git a/biometric/.idea/scopes/buildSrc.xml b/biometric/.idea/scopes/buildSrc.xml
new file mode 120000
index 0000000..25b7d3b
--- /dev/null
+++ b/biometric/.idea/scopes/buildSrc.xml
@@ -0,0 +1 @@
+../../../.idea/scopes/buildSrc.xml
\ No newline at end of file
diff --git a/biometric/gradle b/biometric/gradle
new file mode 120000
index 0000000..1c936b3
--- /dev/null
+++ b/biometric/gradle
@@ -0,0 +1 @@
+../playground-common/gradle
\ No newline at end of file
diff --git a/biometric/gradle.properties b/biometric/gradle.properties
new file mode 120000
index 0000000..d952fb0
--- /dev/null
+++ b/biometric/gradle.properties
@@ -0,0 +1 @@
+../playground-common/androidx-shared.properties
\ No newline at end of file
diff --git a/biometric/gradlew b/biometric/gradlew
new file mode 120000
index 0000000..05b75179
--- /dev/null
+++ b/biometric/gradlew
@@ -0,0 +1 @@
+../playground-common/gradlew
\ No newline at end of file
diff --git a/biometric/gradlew.bat b/biometric/gradlew.bat
new file mode 120000
index 0000000..b20877e
--- /dev/null
+++ b/biometric/gradlew.bat
@@ -0,0 +1 @@
+../playground-common/gradlew.bat
\ No newline at end of file
diff --git a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl b/biometric/settings.gradle
similarity index 65%
copy from car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
copy to biometric/settings.gradle
index 990f255..f090d5a 100644
--- a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
+++ b/biometric/settings.gradle
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.car.app.model;
+// see ../playground-common/README.md for details on how this works
+rootProject.name = "paging-playground"
+apply from: "../playground-common/playground-include-settings.gradle"
+setupPlayground(this, "..")
+selectProjectsFromAndroidX({ name ->
+    if (name.startsWith(":biometric")) return true
+    return false
+})
 
-import androidx.car.app.IOnDoneCallback;
-
-/** @hide */
-oneway interface ISearchListener {
-  void onSearchTextChanged(String text, IOnDoneCallback callback) = 1;
-  void onSearchSubmitted(String text, IOnDoneCallback callback) = 2;
-}
diff --git a/browser/README.md b/browser/README.md
index f4c0498..59bd958 100644
--- a/browser/README.md
+++ b/browser/README.md
@@ -8,7 +8,7 @@
 
 [Library Owners](OWNERS)
 
-[Source Code](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/browser/)
+[Source Code](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/browser/)
 
 [Release Nodes](https://developer.android.com/jetpack/androidx/releases/browser)
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
index 9847fce..e9c4d7a 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXRootPlugin.kt
@@ -31,6 +31,7 @@
 import org.gradle.api.plugins.ExtraPropertiesExtension
 import org.gradle.api.plugins.JavaPlugin
 import org.gradle.api.tasks.bundling.Zip
+import org.gradle.api.tasks.bundling.ZipEntryCompression
 import org.gradle.kotlin.dsl.KotlinClosure1
 import org.gradle.kotlin.dsl.extra
 import java.io.File
@@ -143,6 +144,8 @@
             it.destinationDirectory.set(project.getDistributionDirectory())
             it.archiveFileName.set("androidTest.zip")
             it.from(project.getTestConfigDirectory())
+            // We're mostly zipping a bunch of .apk files that are already compressed
+            it.entryCompression = ZipEntryCompression.STORED
         }
         buildOnServerTask.dependsOn(zipTestConfigsWithApks)
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 321e2c5..8782501 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -24,7 +24,7 @@
     val ADS_IDENTIFIER = Version("1.0.0-alpha04")
     val ANNOTATION = Version("1.2.0-beta01")
     val ANNOTATION_EXPERIMENTAL = Version("1.1.0-alpha02")
-    val APPCOMPAT = Version("1.3.0-alpha03")
+    val APPCOMPAT = Version("1.3.0-beta01")
     val APPSEARCH = Version("1.0.0-alpha01")
     val ARCH_CORE = Version("2.2.0-alpha01")
     val ARCH_CORE_TESTING = ARCH_CORE
@@ -84,7 +84,7 @@
     val MEDIAROUTER = Version("1.3.0-alpha01")
     val NAVIGATION = Version("2.4.0-alpha01")
     val NAVIGATION_COMPOSE = Version("1.0.0-alpha05")
-    val PAGING = Version("3.0.0-alpha11")
+    val PAGING = Version("3.0.0-alpha12")
     val PAGING_COMPOSE = Version("1.0.0-alpha05")
     val PALETTE = Version("1.1.0-alpha01")
     val PRINT = Version("1.1.0-beta01")
diff --git a/camera/README.md b/camera/README.md
index b758868..8ea1e6d 100644
--- a/camera/README.md
+++ b/camera/README.md
@@ -7,7 +7,7 @@
 [Release notes](https://developer.android.com/jetpack/androidx/releases/camera)
 
 [Browse
-source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/camera/)
+source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/camera/)
 
 [Reference
 documentation](https://developer.android.com/reference/androidx/classes.html)
diff --git a/camera/camera-camera2-pipe/dependencies.gradle b/camera/camera-camera2-pipe/dependencies.gradle
index db00727..6cd62b7 100644
--- a/camera/camera-camera2-pipe/dependencies.gradle
+++ b/camera/camera-camera2-pipe/dependencies.gradle
@@ -22,7 +22,7 @@
                 "androidx.annotation:annotation:1.0.0",
                 KOTLIN_STDLIB,
                 KOTLIN_COROUTINES_ANDROID,
-                "org.jetbrains.kotlinx:atomicfu:0.15.0"
+                "org.jetbrains.kotlinx:atomicfu:0.13.1"
         ],
         IMPLEMENTATION : [DAGGER]
     ]
diff --git a/camera/camera-camera2/build.gradle b/camera/camera-camera2/build.gradle
index 02e92f9..7b7671f 100644
--- a/camera/camera-camera2/build.gradle
+++ b/camera/camera-camera2/build.gradle
@@ -63,7 +63,7 @@
     androidTestImplementation(KOTLIN_COROUTINES_ANDROID)
     androidTestImplementation(project(":annotation:annotation-experimental"))
     androidTestImplementation(project(":internal-testutils-truth"))
-    androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.15.0")
+    androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
     androidTestImplementation("androidx.exifinterface:exifinterface:1.0.0")
 }
 android {
diff --git a/camera/camera-lifecycle/build.gradle b/camera/camera-lifecycle/build.gradle
index 5b54bf6..57fe2aa 100644
--- a/camera/camera-lifecycle/build.gradle
+++ b/camera/camera-lifecycle/build.gradle
@@ -44,7 +44,7 @@
     androidTestImplementation(project(":annotation:annotation-experimental"))
     androidTestImplementation(project(":concurrent:concurrent-futures-ktx"))
     androidTestImplementation(project(":internal-testutils-truth"))
-    androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.15.0")
+    androidTestImplementation("org.jetbrains.kotlinx:atomicfu:0.13.1")
 }
 
 android {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
index 7390ce4..6e27cd7 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
@@ -67,6 +67,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicReference;
 
 /** Utility functions for obtaining instances of camera2 classes. */
 public final class CameraUtil {
@@ -569,33 +570,28 @@
      * unavailable if PRETEST_CAMERA_TAG is loggable at the debug level (see Log#isLoggable).
      */
     @NonNull
-    public static RuleChain grantCameraPermissionAndPreTest() {
-        RuleChain rule =
-                RuleChain.outerRule(GrantPermissionRule.grant(Manifest.permission.CAMERA)).around(
-                (base, description) -> new Statement() {
-                    @Override
-                    public void evaluate() throws Throwable {
-                        dumpCameraLensFacingInfo();
-                        assumeTrue(deviceHasCamera());
-                        base.evaluate();
-                    }
-                });
-        if (shouldRunPreTest()) {
-            rule = rule.around(
-                    new CameraUtil.PreTestCamera(Log.isLoggable(PRETEST_CAMERA_TAG, Log.DEBUG)));
-        }
-        return rule;
+    public static TestRule grantCameraPermissionAndPreTest() {
+        return grantCameraPermissionAndPreTest(new PreTestCamera());
     }
 
-    private static boolean shouldRunPreTest() {
-        if (Build.MODEL.contains("pixel 2") && Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
-            // TODO(b/170070248) Pixel 2 HAL died easily if the pretest and CameraX open the
-            //  camera device at the same time. Remove the code after the pixel 2 issue fixed.
-            Logger.d(LOG_TAG, "Skip camera pretest (b/170070248)");
-            return false;
-        }
-
-        return true;
+    /**
+     * Grant the camera permission and test the camera.
+     *
+     * @param cameraTestRule the PreTestCamera rule to execute the camera test.
+     */
+    @NonNull
+    public static TestRule grantCameraPermissionAndPreTest(@NonNull PreTestCamera cameraTestRule) {
+        RuleChain rule =
+                RuleChain.outerRule(GrantPermissionRule.grant(Manifest.permission.CAMERA)).around(
+                        (base, description) -> new Statement() {
+                            @Override
+                            public void evaluate() throws Throwable {
+                                dumpCameraLensFacingInfo();
+                                assumeTrue(deviceHasCamera());
+                                base.evaluate();
+                            }
+                        }).around(cameraTestRule);
+        return rule;
     }
 
     /**
@@ -609,6 +605,11 @@
      */
     public static class PreTestCamera implements TestRule {
         final boolean mThrowOnError;
+        final AtomicReference<Boolean> mCanOpenCamera = new AtomicReference<>();
+
+        public PreTestCamera() {
+            mThrowOnError = Log.isLoggable(PRETEST_CAMERA_TAG, Log.DEBUG);
+        }
 
         public PreTestCamera(boolean throwOnError) {
             mThrowOnError = throwOnError;
@@ -620,26 +621,28 @@
             return new Statement() {
                 @Override
                 public void evaluate() throws Throwable {
-                    boolean backStatus = true;
-                    if (hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK)) {
-                        RetryCameraOpener opener =
-                                new RetryCameraOpener(CameraSelector.LENS_FACING_BACK);
-                        backStatus = opener.openWithRetry(5, 5000);
-                        opener.shutdown();
+                    if (mCanOpenCamera.get() == null) {
+                        boolean backStatus = true;
+                        if (hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK)) {
+                            RetryCameraOpener opener =
+                                    new RetryCameraOpener(CameraSelector.LENS_FACING_BACK);
+                            backStatus = opener.openWithRetry(5, 5000);
+                            opener.shutdown();
+                        }
+
+                        boolean frontStatus = true;
+                        if (hasCameraWithLensFacing(CameraSelector.LENS_FACING_FRONT)) {
+                            RetryCameraOpener opener =
+                                    new RetryCameraOpener(CameraSelector.LENS_FACING_FRONT);
+                            frontStatus = opener.openWithRetry(5, 5000);
+                            opener.shutdown();
+                        }
+                        Logger.d(LOG_TAG,
+                                "PreTest Open camera result " + backStatus + " " + frontStatus);
+                        mCanOpenCamera.set(backStatus && frontStatus);
                     }
 
-                    boolean frontStatus = true;
-                    if (hasCameraWithLensFacing(CameraSelector.LENS_FACING_FRONT)) {
-                        RetryCameraOpener opener =
-                                new RetryCameraOpener(CameraSelector.LENS_FACING_FRONT);
-                        frontStatus = opener.openWithRetry(5, 5000);
-                        opener.shutdown();
-                    }
-                    boolean canOpenCamera = backStatus && frontStatus;
-                    Logger.d(LOG_TAG,
-                            "PreTest Open camera result " + backStatus + " " + frontStatus);
-
-                    if (canOpenCamera) {
+                    if (mCanOpenCamera.get()) {
                         base.evaluate();
                     } else {
                         if (mThrowOnError) {
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
index e9673f0..f4ea58e 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageAnalysisBaseTest.kt
@@ -28,6 +28,7 @@
 import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Assume
+import org.junit.BeforeClass
 import org.junit.Rule
 import org.junit.rules.TestRule
 import java.util.concurrent.TimeUnit
@@ -45,7 +46,7 @@
 abstract class ImageAnalysisBaseTest<A : CameraActivity> {
 
     @get:Rule
-    val mUseCameraRule: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+    val mUseCameraRule: TestRule = CameraUtil.grantCameraPermissionAndPreTest(testCameraRule)
 
     @get:Rule
     val mCameraActivityRules: GrantPermissionRule =
@@ -127,5 +128,14 @@
     companion object {
         protected const val IMAGES_COUNT = 30
         protected const val TIMEOUT = 5L
+
+        @JvmStatic
+        lateinit var testCameraRule: CameraUtil.PreTestCamera
+
+        @BeforeClass
+        @JvmStatic
+        fun classSetup() {
+            testCameraRule = CameraUtil.PreTestCamera()
+        }
     }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
index a3eca5b..b38d2c7 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/rotations/ImageCaptureBaseTest.kt
@@ -35,6 +35,7 @@
 import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Assume.assumeFalse
 import org.junit.Assume.assumeTrue
+import org.junit.BeforeClass
 import org.junit.Rule
 import org.junit.rules.TestRule
 import java.util.concurrent.TimeUnit
@@ -54,7 +55,7 @@
 abstract class ImageCaptureBaseTest<A : CameraActivity> {
 
     @get:Rule
-    val mUseCameraRule: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+    val mUseCameraRule: TestRule = CameraUtil.grantCameraPermissionAndPreTest(testCameraRule)
 
     @get:Rule
     val mCameraActivityRules: GrantPermissionRule =
@@ -196,5 +197,14 @@
         @JvmStatic
         protected val lensFacing =
             arrayOf(CameraSelector.LENS_FACING_BACK, CameraSelector.LENS_FACING_FRONT)
+
+        @JvmStatic
+        lateinit var testCameraRule: CameraUtil.PreTestCamera
+
+        @BeforeClass
+        @JvmStatic
+        fun classSetup() {
+            testCameraRule = CameraUtil.PreTestCamera()
+        }
     }
 }
\ No newline at end of file
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt
index 6ce2c1b..5475a0e 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPager2ActivityTest.kt
@@ -64,10 +64,13 @@
             CameraSelector.LENS_FACING_FRONT,
             CameraSelector.LENS_FACING_BACK
         )
+
+        @JvmField
+        val testCameraRule = CameraUtil.PreTestCamera()
     }
 
     @get:Rule
-    val mUseCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+    val mUseCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest(testCameraRule)
 
     private val mDevice =
         UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt
index 590a29c..eeb4afe 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/viewpager/ViewPagerActivityTest.kt
@@ -64,10 +64,13 @@
             CameraSelector.LENS_FACING_FRONT,
             CameraSelector.LENS_FACING_BACK
         )
+
+        @JvmField
+        val testCameraRule = CameraUtil.PreTestCamera()
     }
 
     @get:Rule
-    val mUseCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+    val mUseCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest(testCameraRule)
 
     private val mDevice =
         UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
diff --git a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
index 16f8e7a..5afd62c 100644
--- a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
+++ b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
@@ -77,13 +77,16 @@
 
         // The minimum luminance for comparing pictures. Arbitrarily chosen.
         private const val MIN_LUMINANCE = 50F
+
+        @JvmField
+        val testCameraRule = CameraUtil.PreTestCamera()
     }
 
     @get:Rule
     val thrown: ExpectedException = ExpectedException.none()
 
     @get:Rule
-    val useCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+    val useCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest(testCameraRule)
 
     @get:Rule
     val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index 7a323fa..e5d1053 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -2,14 +2,15 @@
 package androidx.car.app {
 
   public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
     method public int getLatestCarAppApiLevel();
-    method public String getLibraryVersion();
+    method public String getLibraryDisplayVersion();
     method public int getMinCarAppApiLevel();
   }
 
   public class AppManager {
     method public void invalidate();
-    method public void setSurfaceListener(androidx.car.app.SurfaceListener?);
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
     method public void showToast(CharSequence, int);
   }
 
@@ -64,7 +65,6 @@
 
   public class FailureResponse {
     ctor public FailureResponse(Throwable);
-    ctor public FailureResponse();
     method public int getErrorType();
     method public String getStackTrace();
     field public static final int BUNDLER_EXCEPTION = 1; // 0x1
@@ -76,10 +76,20 @@
     field public static final int UNKNOWN_ERROR = 0; // 0x0
   }
 
+  public class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
   public class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
   }
 
   public class HostInfo {
+    ctor public HostInfo(String, int);
     method public String getPackageName();
     method public int getUid();
   }
@@ -106,7 +116,7 @@
     method public void setResult(Object?);
   }
 
-  public class ScreenManager {
+  @MainThread public class ScreenManager {
     method public androidx.car.app.Screen getTop();
     method public void pop();
     method public void popTo(String);
@@ -123,6 +133,13 @@
     method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
   }
 
+  public interface SurfaceCallback {
+    method public void onStableAreaChanged(android.graphics.Rect);
+    method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
   public class SurfaceContainer {
     ctor public SurfaceContainer(android.view.Surface?, int, int, int);
     method public int getDpi();
@@ -131,13 +148,6 @@
     method public int getWidth();
   }
 
-  public interface SurfaceListener {
-    method public void onStableAreaChanged(android.graphics.Rect);
-    method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
-    method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
-    method public void onVisibleAreaChanged(android.graphics.Rect);
-  }
-
   public class WrappedRuntimeException extends java.lang.RuntimeException {
     ctor public WrappedRuntimeException(Throwable?);
   }
@@ -591,19 +601,19 @@
     method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle?);
   }
 
-  public interface SearchListenerWrapper {
+  public interface SearchCallbackWrapper {
     method public void onSearchSubmitted(String, androidx.car.app.OnDoneCallback);
     method public void onSearchTextChanged(String, androidx.car.app.OnDoneCallback);
   }
 
   public final class SearchTemplate implements androidx.car.app.model.Template {
-    method public static androidx.car.app.model.SearchTemplate.Builder builder(androidx.car.app.model.SearchTemplate.SearchListener);
+    method public static androidx.car.app.model.SearchTemplate.Builder builder(androidx.car.app.model.SearchTemplate.SearchCallback);
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public String? getInitialSearchText();
     method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackWrapper getSearchCallback();
     method public String? getSearchHint();
-    method public androidx.car.app.model.SearchListenerWrapper getSearchListener();
     method public boolean isLoading();
     method public boolean isShowKeyboardByDefault();
   }
@@ -619,7 +629,7 @@
     method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
   }
 
-  public static interface SearchTemplate.SearchListener {
+  public static interface SearchTemplate.SearchCallback {
     method public void onSearchSubmitted(String);
     method public void onSearchTextChanged(String);
   }
@@ -673,111 +683,18 @@
 
 }
 
-package androidx.car.app.model.constraints {
-
-  public class ActionsConstraints {
-    method @VisibleForTesting public static androidx.car.app.model.constraints.ActionsConstraints.Builder builder();
-    method public java.util.Set<java.lang.Integer!> getDisallowedActionTypes();
-    method public int getMaxActions();
-    method public int getMaxCustomTitles();
-    method public java.util.Set<java.lang.Integer!> getRequiredActionTypes();
-    method @VisibleForTesting public androidx.car.app.model.constraints.ActionsConstraints.Builder newBuilder();
-    method public void validateOrThrow(java.util.List<java.lang.Object!>);
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_HEADER;
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_NAVIGATION;
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_SIMPLE;
-  }
-
-  @VisibleForTesting public static final class ActionsConstraints.Builder {
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder addDisallowedActionType(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder addRequiredActionType(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints build();
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder setMaxActions(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder setMaxCustomTitles(int);
-  }
-
-  public class CarColorConstraints {
-    method public void validateOrThrow(androidx.car.app.model.CarColor);
-    field public static final androidx.car.app.model.constraints.CarColorConstraints STANDARD_ONLY;
-    field public static final androidx.car.app.model.constraints.CarColorConstraints UNCONSTRAINED;
-  }
-
-  public class CarIconConstraints {
-    method public androidx.core.graphics.drawable.IconCompat checkSupportedIcon(androidx.core.graphics.drawable.IconCompat);
-    method public void validateOrThrow(androidx.car.app.model.CarIcon?);
-    field public static final androidx.car.app.model.constraints.CarIconConstraints DEFAULT;
-    field public static final androidx.car.app.model.constraints.CarIconConstraints UNCONSTRAINED;
-  }
-
-  public class RowConstraints {
-    method public static androidx.car.app.model.constraints.RowConstraints.Builder builder();
-    method public androidx.car.app.model.constraints.CarIconConstraints getCarIconConstraints();
-    method public int getMaxActionsExclusive();
-    method public int getMaxTextLinesPerRow();
-    method public boolean isImageAllowed();
-    method public boolean isOnClickListenerAllowed();
-    method public boolean isToggleAllowed();
-    method public androidx.car.app.model.constraints.RowConstraints.Builder newBuilder();
-    method public void validateOrThrow(Object);
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_CONSERVATIVE;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_FULL_LIST;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_PANE;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_SIMPLE;
-    field public static final androidx.car.app.model.constraints.RowConstraints UNCONSTRAINED;
-  }
-
-  public static final class RowConstraints.Builder {
-    method public androidx.car.app.model.constraints.RowConstraints build();
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setCarIconConstraints(androidx.car.app.model.constraints.CarIconConstraints);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setImageAllowed(boolean);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setMaxActionsExclusive(int);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setMaxTextLinesPerRow(int);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setOnClickListenerAllowed(boolean);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setToggleAllowed(boolean);
-  }
-
-  public class RowListConstraints {
-    method public static androidx.car.app.model.constraints.RowListConstraints.Builder builder();
-    method public int getMaxActions();
-    method public androidx.car.app.model.constraints.RowConstraints getRowConstraints();
-    method public int getRowListType();
-    method public boolean isAllowSelectableLists();
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder newBuilder();
-    method public void validateOrThrow(androidx.car.app.model.ItemList);
-    method public void validateOrThrow(java.util.List<androidx.car.app.model.SectionedItemList!>);
-    method public void validateOrThrow(androidx.car.app.model.Pane);
-    field public static final int DEFAULT_LIST = 0; // 0x0
-    field public static final int PANE = 1; // 0x1
-    field public static final int ROUTE_PREVIEW = 2; // 0x2
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_CONSERVATIVE;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_FULL_LIST;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_PANE;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_ROUTE_PREVIEW;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_SIMPLE;
-  }
-
-  public static final class RowListConstraints.Builder {
-    method public androidx.car.app.model.constraints.RowListConstraints build();
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setAllowSelectableLists(boolean);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setMaxActions(int);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setRowConstraints(androidx.car.app.model.constraints.RowConstraints);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setRowListType(int);
-  }
-
-}
-
 package androidx.car.app.navigation {
 
   public class NavigationManager {
-    method @MainThread public void clearNavigationManagerListener();
+    method @MainThread public void clearNavigationManagerCallback();
     method @MainThread public void navigationEnded();
     method @MainThread public void navigationStarted();
-    method @MainThread public void setNavigationManagerListener(androidx.car.app.navigation.NavigationManagerListener);
-    method @MainThread public void setNavigationManagerListener(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerListener);
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
     method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
   }
 
-  public interface NavigationManagerListener {
+  public interface NavigationManagerCallback {
     method public void onAutoDriveEnabled();
     method public void onStopNavigation();
   }
@@ -943,7 +860,6 @@
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList?);
-    method @VisibleForTesting public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemListForTesting(androidx.car.app.model.ItemList?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence?);
   }
@@ -964,7 +880,6 @@
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList?);
-    method @VisibleForTesting public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemListForTesting(androidx.car.app.model.ItemList?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence?);
@@ -1117,9 +1032,9 @@
 package androidx.car.app.versioning {
 
   public class CarAppApiLevels {
-    field public static final int LATEST = 1; // 0x1
+    method public static int getLatest();
+    method public static int getOldest();
     field public static final int LEVEL_1 = 1; // 0x1
-    field public static final int OLDEST = 1; // 0x1
   }
 
 }
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index 7a323fa..e5d1053 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -2,14 +2,15 @@
 package androidx.car.app {
 
   public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
     method public int getLatestCarAppApiLevel();
-    method public String getLibraryVersion();
+    method public String getLibraryDisplayVersion();
     method public int getMinCarAppApiLevel();
   }
 
   public class AppManager {
     method public void invalidate();
-    method public void setSurfaceListener(androidx.car.app.SurfaceListener?);
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
     method public void showToast(CharSequence, int);
   }
 
@@ -64,7 +65,6 @@
 
   public class FailureResponse {
     ctor public FailureResponse(Throwable);
-    ctor public FailureResponse();
     method public int getErrorType();
     method public String getStackTrace();
     field public static final int BUNDLER_EXCEPTION = 1; // 0x1
@@ -76,10 +76,20 @@
     field public static final int UNKNOWN_ERROR = 0; // 0x0
   }
 
+  public class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
   public class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
   }
 
   public class HostInfo {
+    ctor public HostInfo(String, int);
     method public String getPackageName();
     method public int getUid();
   }
@@ -106,7 +116,7 @@
     method public void setResult(Object?);
   }
 
-  public class ScreenManager {
+  @MainThread public class ScreenManager {
     method public androidx.car.app.Screen getTop();
     method public void pop();
     method public void popTo(String);
@@ -123,6 +133,13 @@
     method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
   }
 
+  public interface SurfaceCallback {
+    method public void onStableAreaChanged(android.graphics.Rect);
+    method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
   public class SurfaceContainer {
     ctor public SurfaceContainer(android.view.Surface?, int, int, int);
     method public int getDpi();
@@ -131,13 +148,6 @@
     method public int getWidth();
   }
 
-  public interface SurfaceListener {
-    method public void onStableAreaChanged(android.graphics.Rect);
-    method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
-    method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
-    method public void onVisibleAreaChanged(android.graphics.Rect);
-  }
-
   public class WrappedRuntimeException extends java.lang.RuntimeException {
     ctor public WrappedRuntimeException(Throwable?);
   }
@@ -591,19 +601,19 @@
     method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle?);
   }
 
-  public interface SearchListenerWrapper {
+  public interface SearchCallbackWrapper {
     method public void onSearchSubmitted(String, androidx.car.app.OnDoneCallback);
     method public void onSearchTextChanged(String, androidx.car.app.OnDoneCallback);
   }
 
   public final class SearchTemplate implements androidx.car.app.model.Template {
-    method public static androidx.car.app.model.SearchTemplate.Builder builder(androidx.car.app.model.SearchTemplate.SearchListener);
+    method public static androidx.car.app.model.SearchTemplate.Builder builder(androidx.car.app.model.SearchTemplate.SearchCallback);
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public String? getInitialSearchText();
     method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackWrapper getSearchCallback();
     method public String? getSearchHint();
-    method public androidx.car.app.model.SearchListenerWrapper getSearchListener();
     method public boolean isLoading();
     method public boolean isShowKeyboardByDefault();
   }
@@ -619,7 +629,7 @@
     method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
   }
 
-  public static interface SearchTemplate.SearchListener {
+  public static interface SearchTemplate.SearchCallback {
     method public void onSearchSubmitted(String);
     method public void onSearchTextChanged(String);
   }
@@ -673,111 +683,18 @@
 
 }
 
-package androidx.car.app.model.constraints {
-
-  public class ActionsConstraints {
-    method @VisibleForTesting public static androidx.car.app.model.constraints.ActionsConstraints.Builder builder();
-    method public java.util.Set<java.lang.Integer!> getDisallowedActionTypes();
-    method public int getMaxActions();
-    method public int getMaxCustomTitles();
-    method public java.util.Set<java.lang.Integer!> getRequiredActionTypes();
-    method @VisibleForTesting public androidx.car.app.model.constraints.ActionsConstraints.Builder newBuilder();
-    method public void validateOrThrow(java.util.List<java.lang.Object!>);
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_HEADER;
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_NAVIGATION;
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_SIMPLE;
-  }
-
-  @VisibleForTesting public static final class ActionsConstraints.Builder {
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder addDisallowedActionType(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder addRequiredActionType(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints build();
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder setMaxActions(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder setMaxCustomTitles(int);
-  }
-
-  public class CarColorConstraints {
-    method public void validateOrThrow(androidx.car.app.model.CarColor);
-    field public static final androidx.car.app.model.constraints.CarColorConstraints STANDARD_ONLY;
-    field public static final androidx.car.app.model.constraints.CarColorConstraints UNCONSTRAINED;
-  }
-
-  public class CarIconConstraints {
-    method public androidx.core.graphics.drawable.IconCompat checkSupportedIcon(androidx.core.graphics.drawable.IconCompat);
-    method public void validateOrThrow(androidx.car.app.model.CarIcon?);
-    field public static final androidx.car.app.model.constraints.CarIconConstraints DEFAULT;
-    field public static final androidx.car.app.model.constraints.CarIconConstraints UNCONSTRAINED;
-  }
-
-  public class RowConstraints {
-    method public static androidx.car.app.model.constraints.RowConstraints.Builder builder();
-    method public androidx.car.app.model.constraints.CarIconConstraints getCarIconConstraints();
-    method public int getMaxActionsExclusive();
-    method public int getMaxTextLinesPerRow();
-    method public boolean isImageAllowed();
-    method public boolean isOnClickListenerAllowed();
-    method public boolean isToggleAllowed();
-    method public androidx.car.app.model.constraints.RowConstraints.Builder newBuilder();
-    method public void validateOrThrow(Object);
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_CONSERVATIVE;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_FULL_LIST;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_PANE;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_SIMPLE;
-    field public static final androidx.car.app.model.constraints.RowConstraints UNCONSTRAINED;
-  }
-
-  public static final class RowConstraints.Builder {
-    method public androidx.car.app.model.constraints.RowConstraints build();
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setCarIconConstraints(androidx.car.app.model.constraints.CarIconConstraints);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setImageAllowed(boolean);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setMaxActionsExclusive(int);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setMaxTextLinesPerRow(int);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setOnClickListenerAllowed(boolean);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setToggleAllowed(boolean);
-  }
-
-  public class RowListConstraints {
-    method public static androidx.car.app.model.constraints.RowListConstraints.Builder builder();
-    method public int getMaxActions();
-    method public androidx.car.app.model.constraints.RowConstraints getRowConstraints();
-    method public int getRowListType();
-    method public boolean isAllowSelectableLists();
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder newBuilder();
-    method public void validateOrThrow(androidx.car.app.model.ItemList);
-    method public void validateOrThrow(java.util.List<androidx.car.app.model.SectionedItemList!>);
-    method public void validateOrThrow(androidx.car.app.model.Pane);
-    field public static final int DEFAULT_LIST = 0; // 0x0
-    field public static final int PANE = 1; // 0x1
-    field public static final int ROUTE_PREVIEW = 2; // 0x2
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_CONSERVATIVE;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_FULL_LIST;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_PANE;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_ROUTE_PREVIEW;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_SIMPLE;
-  }
-
-  public static final class RowListConstraints.Builder {
-    method public androidx.car.app.model.constraints.RowListConstraints build();
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setAllowSelectableLists(boolean);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setMaxActions(int);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setRowConstraints(androidx.car.app.model.constraints.RowConstraints);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setRowListType(int);
-  }
-
-}
-
 package androidx.car.app.navigation {
 
   public class NavigationManager {
-    method @MainThread public void clearNavigationManagerListener();
+    method @MainThread public void clearNavigationManagerCallback();
     method @MainThread public void navigationEnded();
     method @MainThread public void navigationStarted();
-    method @MainThread public void setNavigationManagerListener(androidx.car.app.navigation.NavigationManagerListener);
-    method @MainThread public void setNavigationManagerListener(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerListener);
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
     method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
   }
 
-  public interface NavigationManagerListener {
+  public interface NavigationManagerCallback {
     method public void onAutoDriveEnabled();
     method public void onStopNavigation();
   }
@@ -943,7 +860,6 @@
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList?);
-    method @VisibleForTesting public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemListForTesting(androidx.car.app.model.ItemList?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence?);
   }
@@ -964,7 +880,6 @@
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList?);
-    method @VisibleForTesting public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemListForTesting(androidx.car.app.model.ItemList?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence?);
@@ -1117,9 +1032,9 @@
 package androidx.car.app.versioning {
 
   public class CarAppApiLevels {
-    field public static final int LATEST = 1; // 0x1
+    method public static int getLatest();
+    method public static int getOldest();
     field public static final int LEVEL_1 = 1; // 0x1
-    field public static final int OLDEST = 1; // 0x1
   }
 
 }
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index 7a323fa..e5d1053 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -2,14 +2,15 @@
 package androidx.car.app {
 
   public final class AppInfo {
+    ctor @VisibleForTesting public AppInfo(int, int, String);
     method public int getLatestCarAppApiLevel();
-    method public String getLibraryVersion();
+    method public String getLibraryDisplayVersion();
     method public int getMinCarAppApiLevel();
   }
 
   public class AppManager {
     method public void invalidate();
-    method public void setSurfaceListener(androidx.car.app.SurfaceListener?);
+    method public void setSurfaceCallback(androidx.car.app.SurfaceCallback?);
     method public void showToast(CharSequence, int);
   }
 
@@ -64,7 +65,6 @@
 
   public class FailureResponse {
     ctor public FailureResponse(Throwable);
-    ctor public FailureResponse();
     method public int getErrorType();
     method public String getStackTrace();
     field public static final int BUNDLER_EXCEPTION = 1; // 0x1
@@ -76,10 +76,20 @@
     field public static final int UNKNOWN_ERROR = 0; // 0x0
   }
 
+  public class HandshakeInfo {
+    ctor public HandshakeInfo(String, int);
+    method public int getHostCarAppApiLevel();
+    method public String getHostPackageName();
+  }
+
   public class HostException extends java.lang.RuntimeException {
+    ctor public HostException(String);
+    ctor public HostException(String, Throwable);
+    ctor public HostException(Throwable);
   }
 
   public class HostInfo {
+    ctor public HostInfo(String, int);
     method public String getPackageName();
     method public int getUid();
   }
@@ -106,7 +116,7 @@
     method public void setResult(Object?);
   }
 
-  public class ScreenManager {
+  @MainThread public class ScreenManager {
     method public androidx.car.app.Screen getTop();
     method public void pop();
     method public void popTo(String);
@@ -123,6 +133,13 @@
     method public abstract androidx.car.app.Screen onCreateScreen(android.content.Intent);
   }
 
+  public interface SurfaceCallback {
+    method public void onStableAreaChanged(android.graphics.Rect);
+    method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
+    method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
+    method public void onVisibleAreaChanged(android.graphics.Rect);
+  }
+
   public class SurfaceContainer {
     ctor public SurfaceContainer(android.view.Surface?, int, int, int);
     method public int getDpi();
@@ -131,13 +148,6 @@
     method public int getWidth();
   }
 
-  public interface SurfaceListener {
-    method public void onStableAreaChanged(android.graphics.Rect);
-    method public void onSurfaceAvailable(androidx.car.app.SurfaceContainer);
-    method public void onSurfaceDestroyed(androidx.car.app.SurfaceContainer);
-    method public void onVisibleAreaChanged(android.graphics.Rect);
-  }
-
   public class WrappedRuntimeException extends java.lang.RuntimeException {
     ctor public WrappedRuntimeException(Throwable?);
   }
@@ -591,19 +601,19 @@
     method public androidx.car.app.model.Row.Builder setToggle(androidx.car.app.model.Toggle?);
   }
 
-  public interface SearchListenerWrapper {
+  public interface SearchCallbackWrapper {
     method public void onSearchSubmitted(String, androidx.car.app.OnDoneCallback);
     method public void onSearchTextChanged(String, androidx.car.app.OnDoneCallback);
   }
 
   public final class SearchTemplate implements androidx.car.app.model.Template {
-    method public static androidx.car.app.model.SearchTemplate.Builder builder(androidx.car.app.model.SearchTemplate.SearchListener);
+    method public static androidx.car.app.model.SearchTemplate.Builder builder(androidx.car.app.model.SearchTemplate.SearchCallback);
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public String? getInitialSearchText();
     method public androidx.car.app.model.ItemList? getItemList();
+    method public androidx.car.app.model.SearchCallbackWrapper getSearchCallback();
     method public String? getSearchHint();
-    method public androidx.car.app.model.SearchListenerWrapper getSearchListener();
     method public boolean isLoading();
     method public boolean isShowKeyboardByDefault();
   }
@@ -619,7 +629,7 @@
     method public androidx.car.app.model.SearchTemplate.Builder setShowKeyboardByDefault(boolean);
   }
 
-  public static interface SearchTemplate.SearchListener {
+  public static interface SearchTemplate.SearchCallback {
     method public void onSearchSubmitted(String);
     method public void onSearchTextChanged(String);
   }
@@ -673,111 +683,18 @@
 
 }
 
-package androidx.car.app.model.constraints {
-
-  public class ActionsConstraints {
-    method @VisibleForTesting public static androidx.car.app.model.constraints.ActionsConstraints.Builder builder();
-    method public java.util.Set<java.lang.Integer!> getDisallowedActionTypes();
-    method public int getMaxActions();
-    method public int getMaxCustomTitles();
-    method public java.util.Set<java.lang.Integer!> getRequiredActionTypes();
-    method @VisibleForTesting public androidx.car.app.model.constraints.ActionsConstraints.Builder newBuilder();
-    method public void validateOrThrow(java.util.List<java.lang.Object!>);
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_HEADER;
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_NAVIGATION;
-    field public static final androidx.car.app.model.constraints.ActionsConstraints ACTIONS_CONSTRAINTS_SIMPLE;
-  }
-
-  @VisibleForTesting public static final class ActionsConstraints.Builder {
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder addDisallowedActionType(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder addRequiredActionType(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints build();
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder setMaxActions(int);
-    method public androidx.car.app.model.constraints.ActionsConstraints.Builder setMaxCustomTitles(int);
-  }
-
-  public class CarColorConstraints {
-    method public void validateOrThrow(androidx.car.app.model.CarColor);
-    field public static final androidx.car.app.model.constraints.CarColorConstraints STANDARD_ONLY;
-    field public static final androidx.car.app.model.constraints.CarColorConstraints UNCONSTRAINED;
-  }
-
-  public class CarIconConstraints {
-    method public androidx.core.graphics.drawable.IconCompat checkSupportedIcon(androidx.core.graphics.drawable.IconCompat);
-    method public void validateOrThrow(androidx.car.app.model.CarIcon?);
-    field public static final androidx.car.app.model.constraints.CarIconConstraints DEFAULT;
-    field public static final androidx.car.app.model.constraints.CarIconConstraints UNCONSTRAINED;
-  }
-
-  public class RowConstraints {
-    method public static androidx.car.app.model.constraints.RowConstraints.Builder builder();
-    method public androidx.car.app.model.constraints.CarIconConstraints getCarIconConstraints();
-    method public int getMaxActionsExclusive();
-    method public int getMaxTextLinesPerRow();
-    method public boolean isImageAllowed();
-    method public boolean isOnClickListenerAllowed();
-    method public boolean isToggleAllowed();
-    method public androidx.car.app.model.constraints.RowConstraints.Builder newBuilder();
-    method public void validateOrThrow(Object);
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_CONSERVATIVE;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_FULL_LIST;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_PANE;
-    field public static final androidx.car.app.model.constraints.RowConstraints ROW_CONSTRAINTS_SIMPLE;
-    field public static final androidx.car.app.model.constraints.RowConstraints UNCONSTRAINED;
-  }
-
-  public static final class RowConstraints.Builder {
-    method public androidx.car.app.model.constraints.RowConstraints build();
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setCarIconConstraints(androidx.car.app.model.constraints.CarIconConstraints);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setImageAllowed(boolean);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setMaxActionsExclusive(int);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setMaxTextLinesPerRow(int);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setOnClickListenerAllowed(boolean);
-    method public androidx.car.app.model.constraints.RowConstraints.Builder setToggleAllowed(boolean);
-  }
-
-  public class RowListConstraints {
-    method public static androidx.car.app.model.constraints.RowListConstraints.Builder builder();
-    method public int getMaxActions();
-    method public androidx.car.app.model.constraints.RowConstraints getRowConstraints();
-    method public int getRowListType();
-    method public boolean isAllowSelectableLists();
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder newBuilder();
-    method public void validateOrThrow(androidx.car.app.model.ItemList);
-    method public void validateOrThrow(java.util.List<androidx.car.app.model.SectionedItemList!>);
-    method public void validateOrThrow(androidx.car.app.model.Pane);
-    field public static final int DEFAULT_LIST = 0; // 0x0
-    field public static final int PANE = 1; // 0x1
-    field public static final int ROUTE_PREVIEW = 2; // 0x2
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_CONSERVATIVE;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_FULL_LIST;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_PANE;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_ROUTE_PREVIEW;
-    field public static final androidx.car.app.model.constraints.RowListConstraints ROW_LIST_CONSTRAINTS_SIMPLE;
-  }
-
-  public static final class RowListConstraints.Builder {
-    method public androidx.car.app.model.constraints.RowListConstraints build();
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setAllowSelectableLists(boolean);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setMaxActions(int);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setRowConstraints(androidx.car.app.model.constraints.RowConstraints);
-    method public androidx.car.app.model.constraints.RowListConstraints.Builder setRowListType(int);
-  }
-
-}
-
 package androidx.car.app.navigation {
 
   public class NavigationManager {
-    method @MainThread public void clearNavigationManagerListener();
+    method @MainThread public void clearNavigationManagerCallback();
     method @MainThread public void navigationEnded();
     method @MainThread public void navigationStarted();
-    method @MainThread public void setNavigationManagerListener(androidx.car.app.navigation.NavigationManagerListener);
-    method @MainThread public void setNavigationManagerListener(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerListener);
+    method @MainThread public void setNavigationManagerCallback(androidx.car.app.navigation.NavigationManagerCallback);
+    method @MainThread public void setNavigationManagerCallback(java.util.concurrent.Executor, androidx.car.app.navigation.NavigationManagerCallback);
     method @MainThread public void updateTrip(androidx.car.app.navigation.model.Trip);
   }
 
-  public interface NavigationManagerListener {
+  public interface NavigationManagerCallback {
     method public void onAutoDriveEnabled();
     method public void onStopNavigation();
   }
@@ -943,7 +860,6 @@
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList?);
-    method @VisibleForTesting public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setItemListForTesting(androidx.car.app.model.ItemList?);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(CharSequence?);
   }
@@ -964,7 +880,6 @@
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setActionStrip(androidx.car.app.model.ActionStrip?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setHeaderAction(androidx.car.app.model.Action?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemList(androidx.car.app.model.ItemList?);
-    method @VisibleForTesting public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setItemListForTesting(androidx.car.app.model.ItemList?);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setLoading(boolean);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setNavigateAction(androidx.car.app.model.Action);
     method public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(CharSequence?);
@@ -1117,9 +1032,9 @@
 package androidx.car.app.versioning {
 
   public class CarAppApiLevels {
-    field public static final int LATEST = 1; // 0x1
+    method public static int getLatest();
+    method public static int getOldest();
     field public static final int LEVEL_1 = 1; // 0x1
-    field public static final int OLDEST = 1; // 0x1
   }
 
 }
diff --git a/car/app/app/src/main/aidl/androidx/car/app/IAppHost.aidl b/car/app/app/src/main/aidl/androidx/car/app/IAppHost.aidl
index 080b381..8ca48e6 100644
--- a/car/app/app/src/main/aidl/androidx/car/app/IAppHost.aidl
+++ b/car/app/app/src/main/aidl/androidx/car/app/IAppHost.aidl
@@ -16,7 +16,7 @@
 
 package androidx.car.app;
 
-import androidx.car.app.ISurfaceListener;
+import androidx.car.app.ISurfaceCallback;
 
 /** @hide */
 interface IAppHost {
@@ -27,7 +27,7 @@
   void showToast(CharSequence text, int duration) = 2;
 
   /**
-   * Registers the listener to get callbacks for surface events.
+   * Registers the callback to get surface events.
    */
-  void setSurfaceListener(@nullable ISurfaceListener listener) = 3;
+  void setSurfaceCallback(@nullable ISurfaceCallback callback) = 3;
 }
diff --git a/car/app/app/src/main/aidl/androidx/car/app/ISurfaceListener.aidl b/car/app/app/src/main/aidl/androidx/car/app/ISurfaceCallback.aidl
similarity index 97%
rename from car/app/app/src/main/aidl/androidx/car/app/ISurfaceListener.aidl
rename to car/app/app/src/main/aidl/androidx/car/app/ISurfaceCallback.aidl
index 7d9192d..e8f5a8b 100644
--- a/car/app/app/src/main/aidl/androidx/car/app/ISurfaceListener.aidl
+++ b/car/app/app/src/main/aidl/androidx/car/app/ISurfaceCallback.aidl
@@ -23,7 +23,7 @@
 import androidx.car.app.IOnDoneCallback;
 
 /** @hide */
-oneway interface ISurfaceListener {
+oneway interface ISurfaceCallback {
   /**
    * Notifies the app that the surface has changed.
    */
diff --git a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl b/car/app/app/src/main/aidl/androidx/car/app/model/ISearchCallback.aidl
similarity index 95%
rename from car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
rename to car/app/app/src/main/aidl/androidx/car/app/model/ISearchCallback.aidl
index 990f255..0ff0eab 100644
--- a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
+++ b/car/app/app/src/main/aidl/androidx/car/app/model/ISearchCallback.aidl
@@ -19,7 +19,7 @@
 import androidx.car.app.IOnDoneCallback;
 
 /** @hide */
-oneway interface ISearchListener {
+oneway interface ISearchCallback {
   void onSearchTextChanged(String text, IOnDoneCallback callback) = 1;
   void onSearchSubmitted(String text, IOnDoneCallback callback) = 2;
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/AppInfo.java b/car/app/app/src/main/java/androidx/car/app/AppInfo.java
index 4c52330..21ddd66 100644
--- a/car/app/app/src/main/java/androidx/car/app/AppInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/AppInfo.java
@@ -52,6 +52,7 @@
  * </manifest>
  * }</pre>
  * <p>
+ *
  * @see CarContext#getCarAppApiLevel()
  */
 public final class AppInfo {
@@ -70,32 +71,34 @@
     @CarAppApiLevel
     private final int mLatestCarAppApiLevel;
 
-    /** @hide */
+    /**
+     * Creates an instance of {@link AppInfo} based on the input {@link Context}.
+     *
+     * @hide
+     */
     @RestrictTo(Scope.LIBRARY)
     @NonNull
     public static AppInfo create(@NonNull Context context) {
         @CarAppApiLevel
         int minApiLevel = retrieveMinCarAppApiLevel(context);
-        if (minApiLevel < CarAppApiLevels.OLDEST || minApiLevel > CarAppApiLevels.LATEST) {
+        if (minApiLevel < CarAppApiLevels.getOldest()
+                || minApiLevel > CarAppApiLevels.getLatest()) {
             throw new IllegalArgumentException("Min API level (" + MIN_API_LEVEL_MANIFEST_KEY
-                    + "=" + minApiLevel + ") is out of range (" + CarAppApiLevels.OLDEST + "-"
-                    + CarAppApiLevels.LATEST + ")");
+                    + "=" + minApiLevel + ") is out of range (" + CarAppApiLevels.getOldest() + "-"
+                    + CarAppApiLevels.getLatest() + ")");
         }
-        return new AppInfo(minApiLevel, CarAppApiLevels.LATEST, LIBRARY_VERSION);
+        return new AppInfo(minApiLevel, CarAppApiLevels.getLatest(), LIBRARY_VERSION);
     }
 
-    // Used for serialization
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY)
-    public AppInfo() {
-        mMinCarAppApiLevel = 0;
-        mLibraryVersion = null;
-        mLatestCarAppApiLevel = 0;
-    }
 
-    // Used for testing
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY)
+    /**
+     * Creates an instance of {@link AppInfo} with the provided version information.
+     *
+     * @param minCarAppApiLevel    the minimal API level that can work with an app built with
+     *                             the library.
+     * @param latestCarAppApiLevel the latest API level the library supports.
+     * @param libraryVersion       the library artifact version.
+     */
     @VisibleForTesting
     public AppInfo(@CarAppApiLevel int minCarAppApiLevel, @CarAppApiLevel int latestCarAppApiLevel,
             @NonNull String libraryVersion) {
@@ -104,6 +107,13 @@
         mLatestCarAppApiLevel = latestCarAppApiLevel;
     }
 
+    // Used for serialization
+    private AppInfo() {
+        mMinCarAppApiLevel = 0;
+        mLibraryVersion = null;
+        mLatestCarAppApiLevel = 0;
+    }
+
     /** @hide */
     @RestrictTo(Scope.LIBRARY)
     @VisibleForTesting
@@ -115,19 +125,23 @@
                     PackageManager.GET_META_DATA);
             if (applicationInfo.metaData == null) {
                 Log.i(TAG, "Min API level not found (" + MIN_API_LEVEL_MANIFEST_KEY + "). "
-                        + "Assuming min API level = " + CarAppApiLevels.LATEST);
-                return CarAppApiLevels.LATEST;
+                        + "Assuming min API level = " + CarAppApiLevels.getLatest());
+                return CarAppApiLevels.getLatest();
             }
             return applicationInfo.metaData.getInt(MIN_API_LEVEL_MANIFEST_KEY);
         } catch (PackageManager.NameNotFoundException e) {
             Log.e(TAG, "Unable to read min API level from manifest. Assuming "
-                            + CarAppApiLevels.LATEST, e);
-            return CarAppApiLevels.LATEST;
+                    + CarAppApiLevels.getLatest(), e);
+            return CarAppApiLevels.getLatest();
         }
     }
 
+    /**
+     * String representation of library version. This version string is opaque and not meant to
+     * be parsed.
+     */
     @NonNull
-    public String getLibraryVersion() {
+    public String getLibraryDisplayVersion() {
         return requireNonNull(mLibraryVersion);
     }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/AppManager.java b/car/app/app/src/main/java/androidx/car/app/AppManager.java
index 7e86611..5a78c38 100644
--- a/car/app/app/src/main/java/androidx/car/app/AppManager.java
+++ b/car/app/app/src/main/java/androidx/car/app/AppManager.java
@@ -41,11 +41,9 @@
     private final HostDispatcher mHostDispatcher;
 
     /**
-     * Sets the {@link SurfaceListener} to get changes and updates to the surface on which the
+     * Sets the {@link SurfaceCallback} to get changes and updates to the surface on which the
      * app can draw custom content, or {@code null} to reset the listener.
      *
-     *
-     *
      * <p>This call requires the {@code androidx.car.app.ACCESS_SURFACE}
      * permission to be declared.
      *
@@ -59,11 +57,11 @@
      * @throws HostException     if the remote call fails.
      */
     @SuppressLint("ExecutorRegistration")
-    public void setSurfaceListener(@Nullable SurfaceListener surfaceListener) {
+    public void setSurfaceCallback(@Nullable SurfaceCallback surfaceCallback) {
         mHostDispatcher.dispatch(
                 CarContext.APP_SERVICE,
                 (IAppHost host) -> {
-                    host.setSurfaceListener(RemoteUtils.stubSurfaceListener(surfaceListener));
+                    host.setSurfaceCallback(RemoteUtils.stubSurfaceCallback(surfaceCallback));
                     return null;
                 },
                 "setSurfaceListener");
diff --git a/car/app/app/src/main/java/androidx/car/app/FailureResponse.java b/car/app/app/src/main/java/androidx/car/app/FailureResponse.java
index bf8e38a..a4aede9 100644
--- a/car/app/app/src/main/java/androidx/car/app/FailureResponse.java
+++ b/car/app/app/src/main/java/androidx/car/app/FailureResponse.java
@@ -16,6 +16,8 @@
 
 package androidx.car.app;
 
+import static androidx.annotation.RestrictTo.Scope;
+
 import static java.util.Objects.requireNonNull;
 
 import android.os.RemoteException;
@@ -24,11 +26,13 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.car.app.serialization.BundlerException;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.security.InvalidParameterException;
+import java.util.Objects;
 
 /**
  * Denotes a failure in the client to a host request.
@@ -51,6 +55,7 @@
                     RUNTIME_EXCEPTION,
                     REMOTE_EXCEPTION
             })
+    @RestrictTo(Scope.LIBRARY)
     @Retention(RetentionPolicy.SOURCE)
     public @interface ErrorType {
     }
@@ -68,6 +73,11 @@
     @ErrorType
     private final int mErrorType;
 
+    /**
+     * Creates an instance of {@link FailureResponse}.
+     *
+     * @param exception the originating cause of the failure.
+     */
     public FailureResponse(@NonNull Throwable exception) {
         this.mStackTrace = Log.getStackTraceString(requireNonNull(exception));
         if (exception instanceof BundlerException) {
@@ -88,18 +98,35 @@
     }
 
     // Used for serialization.
-    public FailureResponse() {
+    private FailureResponse() {
         mStackTrace = null;
         mErrorType = UNKNOWN_ERROR;
     }
 
+    /** Returns the stack trace of the originating exception. */
     @NonNull
     public String getStackTrace() {
         return requireNonNull(mStackTrace);
     }
 
+    /** Returns the type of the originating exception. */
     @ErrorType
     public int getErrorType() {
         return mErrorType;
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mErrorType, mStackTrace);
+    }
+
+    @Override
+    public boolean equals(@Nullable Object obj) {
+        if (!(obj instanceof FailureResponse)) {
+            return false;
+        }
+        FailureResponse other = (FailureResponse) obj;
+
+        return mErrorType == other.mErrorType && Objects.equals(mStackTrace, other.mStackTrace);
+    }
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java b/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java
index 8b92f28..a3328fe 100644
--- a/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java
@@ -20,37 +20,44 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.RestrictTo.Scope;
 
 /**
  * A container for the information conveyed by the host after the handshake with the app is
  * completed.
- *
- * @hide
  */
-@RestrictTo(Scope.LIBRARY)
 public class HandshakeInfo {
     @Nullable
     private final String mHostPackageName;
     private final int mHostCarAppApiLevel;
 
+    /**
+     * Creates an instance of {@link HandshakeInfo}.
+     *
+     * @param hostPackageName    the host package name.
+     * @param hostCarAppApiLevel the API level that should be used to communicate with the host.
+     */
     public HandshakeInfo(@NonNull String hostPackageName, int hostCarAppApiLevel) {
         mHostPackageName = hostPackageName;
         mHostCarAppApiLevel = hostCarAppApiLevel;
     }
 
     // Used for serialization
-    public HandshakeInfo() {
+    private HandshakeInfo() {
         mHostPackageName = null;
         mHostCarAppApiLevel = 0;
     }
 
+    /**
+     * Returns the host package name.
+     */
     @NonNull
     public String getHostPackageName() {
         return requireNonNull(mHostPackageName);
     }
 
+    /**
+     * Returns the negotiated API level that should be used to communicate with the host.
+     */
     public int getHostCarAppApiLevel() {
         return mHostCarAppApiLevel;
     }
diff --git a/car/app/app/src/main/java/androidx/car/app/HostException.java b/car/app/app/src/main/java/androidx/car/app/HostException.java
index a7e878e..092ac41 100644
--- a/car/app/app/src/main/java/androidx/car/app/HostException.java
+++ b/car/app/app/src/main/java/androidx/car/app/HostException.java
@@ -16,28 +16,35 @@
 
 package androidx.car.app;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
 
 /** Exceptions that happen on calls to the host. */
 // Developers can catch this exception so keeping it.
 public class HostException extends RuntimeException {
-    /** @hide */
-    @RestrictTo(LIBRARY)
+    /**
+     * Creates an instance of {@link HostException} with the given {@code message}.
+     *
+     * @param message the exception message.
+     */
     public HostException(@NonNull String message) {
         super(message);
     }
 
-    /** @hide */
-    @RestrictTo(LIBRARY)
+    /**
+     * Creates an instance of {@link HostException} with the given {@code message}.
+     *
+     * @param message the exception message.
+     * @param cause   the originating cause of the exception.
+     */
     public HostException(@NonNull String message, @NonNull Throwable cause) {
         super(message, cause);
     }
 
-    /** @hide */
-    @RestrictTo(LIBRARY)
+    /**
+     * Creates an instance of {@link HostException} with the given {@code cause}.
+     *
+     * @param cause the originating cause of the exception.
+     */
     public HostException(@NonNull Throwable cause) {
         super(cause);
     }
diff --git a/car/app/app/src/main/java/androidx/car/app/HostInfo.java b/car/app/app/src/main/java/androidx/car/app/HostInfo.java
index 7174e18..f22f061 100644
--- a/car/app/app/src/main/java/androidx/car/app/HostInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/HostInfo.java
@@ -19,7 +19,6 @@
 import static java.util.Objects.requireNonNull;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
 
 /**
  * Container class for information about the host the app is connected to.
@@ -41,10 +40,7 @@
 
     /**
      * Constructs an instance of the HostInfo from the required package name, uid and API level.
-     *
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
     public HostInfo(@NonNull String packageName, int uid) {
         mPackageName = requireNonNull(packageName);
         mUid = uid;
diff --git a/car/app/app/src/main/java/androidx/car/app/ScreenManager.java b/car/app/app/src/main/java/androidx/car/app/ScreenManager.java
index 1b9d079..556214e 100644
--- a/car/app/app/src/main/java/androidx/car/app/ScreenManager.java
+++ b/car/app/app/src/main/java/androidx/car/app/ScreenManager.java
@@ -18,6 +18,7 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
 import static androidx.car.app.utils.CommonUtils.TAG;
+import static androidx.car.app.utils.ThreadUtils.checkMainThread;
 
 import static java.util.Objects.requireNonNull;
 
@@ -29,7 +30,6 @@
 import androidx.annotation.RestrictTo;
 import androidx.car.app.model.TemplateInfo;
 import androidx.car.app.model.TemplateWrapper;
-import androidx.car.app.utils.ThreadUtils;
 import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.Lifecycle.Event;
@@ -44,9 +44,8 @@
 
 /**
  * Manages the stack of {@link Screen}s and their respective {@link Lifecycle}s.
- *
- * <p>This class is not safe for concurrent access.
  */
+@MainThread
 public class ScreenManager {
     private final Deque<Screen> mScreenStack = new ArrayDeque<>();
     private final CarContext mCarContext;
@@ -59,9 +58,11 @@
      *                              pushed to the stack via {@link #push}, or
      *                              {@link #pushForResult}, or returning a {@link Screen} from
      *                              {@link Session#onCreateScreen}.
+     * @throws IllegalStateException if the current thread is not the main thread.
      */
     @NonNull
     public Screen getTop() {
+        checkMainThread();
         return requireNonNull(mScreenStack.peek());
     }
 
@@ -72,8 +73,10 @@
      * stack.
      *
      * @throws NullPointerException if {@code screen} is {@code null}.
+     * @throws IllegalStateException if the current thread is not the main thread.
      */
     public void push(@NonNull Screen screen) {
+        checkMainThread();
         pushInternal(requireNonNull(screen));
     }
 
@@ -84,13 +87,18 @@
      * callback to {@link OnScreenResultListener#onScreenResult} with the result that the pushed
      * {@code screen} set via {@link Screen#setResult}.
      *
+     * @param screen the {@link Screen} to push on top of the stack.
+     * @param onScreenResultListener the listener that will be executed with the result pushed by
+     *                               the {@code screen} through {@link Screen#setResult}. This
+     *                               callback will be executed on the main thread.
      * @throws NullPointerException if either the {@code screen} or the {@code
      *                              onScreenResultCallback} are {@code null}.
+     * @throws IllegalStateException if the current thread is not the main thread.
      */
-    // TODO(rampara): Add Executor parameter.
     @SuppressLint("ExecutorRegistration")
     public void pushForResult(
             @NonNull Screen screen, @NonNull OnScreenResultListener onScreenResultListener) {
+        checkMainThread();
         requireNonNull(screen).setOnScreenResultListener(requireNonNull(onScreenResultListener));
         pushInternal(screen);
     }
@@ -99,8 +107,11 @@
      * Pops the top {@link Screen} from the stack.
      *
      * <p>If the top {@link Screen} is the only {@link Screen} in the stack, it will not be removed.
+     *
+     * @throws IllegalStateException if the current thread is not the main thread.
      */
     public void pop() {
+        checkMainThread();
         if (mScreenStack.size() > 1) {
             popInternal(Collections.singletonList(mScreenStack.pop()));
         }
@@ -113,9 +124,12 @@
      * <p>The root {@link Screen} will not be popped.
      *
      * @throws NullPointerException if {@code marker} is {@code null}.
+     * @throws IllegalStateException if the current thread is not the main thread.
+     *
      * @see Screen#setMarker
      */
     public void popTo(@NonNull String marker) {
+        checkMainThread();
         requireNonNull(marker);
 
         // Pop all screens, except until found root or the provided screen.
@@ -134,8 +148,12 @@
 
     /**
      * Removes all screens from the stack until the root has been reached.
+     *
+     * @throws IllegalStateException if the current thread is not the main thread.
      */
     public void popToRoot() {
+        checkMainThread();
+
         if (mScreenStack.size() <= 1) {
             return;
         }
@@ -155,8 +173,10 @@
      * <p>If the {@code screen} is the only {@link Screen} in the stack, it will not be removed.
      *
      * @throws NullPointerException if {@code screen} is {@code null}.
+     * @throws IllegalStateException if the current thread is not the main thread.
      */
     public void remove(@NonNull Screen screen) {
+        checkMainThread();
         requireNonNull(screen);
 
         if (mScreenStack.size() <= 1) {
@@ -184,9 +204,8 @@
 
     /** Returns the {@link TemplateWrapper} for the {@link Screen} that is on top of the stack. */
     @NonNull
-    @MainThread
     TemplateWrapper getTopTemplate() {
-        ThreadUtils.checkMainThread();
+        checkMainThread();
 
         Screen screen = getTop();
         Log.d(TAG, "Requesting template from Screen " + screen);
diff --git a/car/app/app/src/main/java/androidx/car/app/Session.java b/car/app/app/src/main/java/androidx/car/app/Session.java
index e77907a..13f9db0 100644
--- a/car/app/app/src/main/java/androidx/car/app/Session.java
+++ b/car/app/app/src/main/java/androidx/car/app/Session.java
@@ -89,6 +89,8 @@
      * <p>Listeners that are added in {@link Lifecycle.Event#ON_CREATE} should be removed in {@link
      * Lifecycle.Event#ON_DESTROY}.
      *
+     * <p>Note lifecycle callbacks will be executed on the main thread.
+     *
      * @see androidx.lifecycle.LifecycleObserver
      */
     @NonNull
diff --git a/car/app/app/src/main/java/androidx/car/app/SurfaceListener.java b/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
similarity index 96%
rename from car/app/app/src/main/java/androidx/car/app/SurfaceListener.java
rename to car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
index f59c8d6..ba8c853 100644
--- a/car/app/app/src/main/java/androidx/car/app/SurfaceListener.java
+++ b/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
@@ -20,8 +20,8 @@
 
 import androidx.annotation.NonNull;
 
-/** A listener for changes on the {@link SurfaceContainer} and its attributes. */
-public interface SurfaceListener {
+/** A callback for changes on the {@link SurfaceContainer} and its attributes. */
+public interface SurfaceCallback {
     /**
      * Provides a {@link SurfaceContainer} from the host which is ready for drawing.
      *
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java b/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
index b9fdfb3..8691c2b 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
@@ -16,8 +16,6 @@
 
 package androidx.car.app.model;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
-
 import static java.util.Objects.requireNonNull;
 
 import android.text.TextPaint;
@@ -27,8 +25,6 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.VisibleForTesting;
 import androidx.car.app.model.constraints.CarColorConstraints;
 
 import java.util.Objects;
@@ -75,14 +71,6 @@
         return new ForegroundCarColorSpan(requireNonNull(carColor));
     }
 
-    /** @hide */
-    @RestrictTo(LIBRARY)
-    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-    @NonNull
-    public static ForegroundCarColorSpan createForTesting(@NonNull CarColor carColor) {
-        return new ForegroundCarColorSpan(carColor);
-    }
-
     @Override
     public void updateDrawState(@NonNull TextPaint paint) {
         // Not relevant.
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
index 309b73f..5d5d5b9 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
@@ -16,7 +16,6 @@
 
 package androidx.car.app.model;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_HEADER;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_SIMPLE;
 import static androidx.car.app.model.constraints.RowListConstraints.ROW_LIST_CONSTRAINTS_FULL_LIST;
@@ -28,7 +27,6 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
 import androidx.car.app.Screen;
 
 import java.util.ArrayList;
@@ -190,14 +188,12 @@
 
         /**
          * Sets the {@link Action} that will be displayed in the header of the template, or
-         * {@code null}
-         * to not display an action.
+         * {@code null} to not display an action.
          *
          * <h4>Requirements</h4>
          *
          * This template only supports either one of {@link Action#APP_ICON} and
-         * {@link Action#BACK} as
-         * a header {@link Action}.
+         * {@link Action#BACK} as a header {@link Action}.
          *
          * @throws IllegalArgumentException if {@code headerAction} does not meet the template's
          *                                  requirements.
@@ -213,8 +209,7 @@
 
         /**
          * Sets the {@link CharSequence} to show as the template's title, or {@code null} to not
-         * show a
-         * title.
+         * show a title.
          */
         @NonNull
         public Builder setTitle(@Nullable CharSequence title) {
@@ -226,8 +221,7 @@
          * Sets a single {@link ItemList} to show in the template.
          *
          * <p>Note that this list cannot be mixed with others added via {@link #addList}. If
-         * multiple
-         * lists were previously added, they will be cleared.
+         * multiple lists were previously added, they will be cleared.
          *
          * @throws NullPointerException if {@code list} is null.
          * @see #addList(ItemList, CharSequence)
@@ -244,12 +238,9 @@
          * Adds an {@link ItemList} to display in the template.
          *
          * <p>Use this method to add multiple {@link ItemList}s to the template. Each
-         * {@link ItemList}
-         * will be grouped under the given {@code header}. These lists cannot be mixed with an
-         * {@link
-         * ItemList} added via {@link #setSingleList}. If a single list was previously added, it
-         * will be
-         * cleared.
+         * {@link ItemList} will be grouped under the given {@code header}. These lists cannot be
+         * mixed with an {@link ItemList} added via {@link #setSingleList}. If a single list was
+         * previously added, it will be cleared.
          *
          * <p>If the added {@link ItemList} contains a {@link ItemList.OnSelectedListener}, then it
          * cannot be added alongside other {@link ItemList}(s).
@@ -292,15 +283,6 @@
             return this;
         }
 
-        /** @hide */
-        @RestrictTo(LIBRARY)
-        @NonNull
-        public Builder addListForTesting(@NonNull ItemList list, @NonNull CharSequence header) {
-            mSingleList = null;
-            mSectionLists.add(SectionedItemList.create(list, CarText.create(header)));
-            return this;
-        }
-
         /**
          * Sets the {@link ActionStrip} for this template, or {@code null} to not display an {@link
          * ActionStrip}.
@@ -362,13 +344,6 @@
             return new ListTemplate(this);
         }
 
-        /** @hide */
-        @RestrictTo(LIBRARY)
-        @NonNull
-        public ListTemplate buildForTesting() {
-            return new ListTemplate(this);
-        }
-
         Builder() {
         }
     }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
index 1fd618a..64f0338 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
@@ -16,7 +16,6 @@
 
 package androidx.car.app.model;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_HEADER;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_SIMPLE;
 import static androidx.car.app.model.constraints.RowListConstraints.ROW_LIST_CONSTRAINTS_PANE;
@@ -26,7 +25,6 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
 
 import java.util.Collections;
 import java.util.Objects;
@@ -240,12 +238,5 @@
 
             return new PaneTemplate(this);
         }
-
-        /** @hide */
-        @RestrictTo(LIBRARY)
-        @NonNull
-        public PaneTemplate buildForTesting() {
-            return new PaneTemplate(this);
-        }
     }
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
index 4d8c338..02f3360 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
@@ -16,7 +16,6 @@
 
 package androidx.car.app.model;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_HEADER;
 import static androidx.car.app.model.constraints.ActionsConstraints.ACTIONS_CONSTRAINTS_SIMPLE;
 import static androidx.car.app.model.constraints.RowListConstraints.ROW_LIST_CONSTRAINTS_SIMPLE;
@@ -27,7 +26,6 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
 import androidx.car.app.CarAppPermission;
 
 import java.util.Collections;
@@ -290,14 +288,6 @@
             return this;
         }
 
-        /** @hide */
-        @RestrictTo(LIBRARY)
-        @NonNull
-        public Builder setItemListForTesting(@Nullable ItemList itemList) {
-            this.mItemList = itemList;
-            return this;
-        }
-
         /**
          * Sets the {@link ActionStrip} for this template, or {@code null} to not display an {@link
          * ActionStrip}.
diff --git a/car/app/app/src/main/java/androidx/car/app/model/SearchListenerWrapper.java b/car/app/app/src/main/java/androidx/car/app/model/SearchCallbackWrapper.java
similarity index 97%
rename from car/app/app/src/main/java/androidx/car/app/model/SearchListenerWrapper.java
rename to car/app/app/src/main/java/androidx/car/app/model/SearchCallbackWrapper.java
index d331059..c405946 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/SearchListenerWrapper.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/SearchCallbackWrapper.java
@@ -22,7 +22,7 @@
 /**
  * A host-side interface for reporting to search updates to clients.
  */
-public interface SearchListenerWrapper {
+public interface SearchCallbackWrapper {
     /**
      * Notifies that the search text has changed.
      *
diff --git a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
index 04258a8..eadf70b 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
@@ -48,7 +48,7 @@
 public final class SearchTemplate implements Template {
 
     /** A listener for search updates. */
-    public interface SearchListener {
+    public interface SearchCallback {
         /**
          * Notifies the current {@code searchText}.
          *
@@ -72,7 +72,7 @@
     @Keep
     private final boolean mIsLoading;
     @Keep
-    private final SearchListenerWrapper mSearchListener;
+    private final SearchCallbackWrapper mSearchCallback;
     @Keep
     @Nullable
     private final String mInitialSearchText;
@@ -92,18 +92,18 @@
     private final ActionStrip mActionStrip;
 
     /**
-     * Constructs a new builder of {@link SearchTemplate} with the input {@link SearchListener}.
+     * Constructs a new builder of {@link SearchTemplate} with the input {@link SearchCallback}.
      *
-     * <p>Note that the listener relates to UI events and will be executed on the main thread
+     * <p>Note that the callback relates to UI events and will be executed on the main thread
      * using {@link Looper#getMainLooper()}.
      *
-     * @param listener the listener to be invoked for events such as when the user types new
+     * @param callback the callback to be invoked for events such as when the user types new
      *                 text, or submits a search.
      */
     @NonNull
     @SuppressLint("ExecutorRegistration")
-    public static Builder builder(@NonNull SearchListener listener) {
-        return new Builder(listener);
+    public static Builder builder(@NonNull SearchCallback callback) {
+        return new Builder(callback);
     }
 
     public boolean isLoading() {
@@ -154,11 +154,11 @@
     }
 
     /**
-     * Returns the {@link SearchListenerWrapper} for search callbacks.
+     * Returns the {@link SearchCallbackWrapper} for search callbacks.
      */
     @NonNull
-    public SearchListenerWrapper getSearchListener() {
-        return mSearchListener;
+    public SearchCallbackWrapper getSearchCallback() {
+        return mSearchCallback;
     }
 
     /**
@@ -213,7 +213,7 @@
         mSearchHint = builder.mSearchHint;
         mIsLoading = builder.mIsLoading;
         mItemList = builder.mItemList;
-        mSearchListener = builder.mSearchListener;
+        mSearchCallback = builder.mSearchCallback;
         mShowKeyboardByDefault = builder.mShowKeyboardByDefault;
         mHeaderAction = builder.mHeaderAction;
         mActionStrip = builder.mActionStrip;
@@ -227,8 +227,8 @@
         mItemList = null;
         mHeaderAction = null;
         mActionStrip = null;
-        mSearchListener = createSearchListener(
-                new SearchListener() {
+        mSearchCallback = createSearchCallback(
+                new SearchCallback() {
                     @Override
                     public void onSearchTextChanged(@NonNull String searchText) {
                     }
@@ -242,7 +242,7 @@
 
     /** A builder of {@link SearchTemplate}. */
     public static final class Builder {
-        final SearchListenerWrapper mSearchListener;
+        final SearchCallbackWrapper mSearchCallback;
         @Nullable
         String mInitialSearchText;
         @Nullable
@@ -256,8 +256,8 @@
         @Nullable
         ActionStrip mActionStrip;
 
-        Builder(SearchListener listener) {
-            mSearchListener = createSearchListener(listener);
+        Builder(SearchCallback callback) {
+            mSearchCallback = createSearchCallback(callback);
         }
 
         /**
@@ -404,15 +404,15 @@
         }
     }
 
-    static SearchListenerWrapper createSearchListener(@NonNull SearchListener listener) {
-        return new SearchListenerWrapper() {
-            private final ISearchListener mStubListener = new SearchListenerStub(listener);
+    static SearchCallbackWrapper createSearchCallback(@NonNull SearchCallback callback) {
+        return new SearchCallbackWrapper() {
+            private final ISearchCallback mStubCallback = new SearchCallbackStub(callback);
 
             @Override
             public void onSearchTextChanged(@NonNull String searchText,
                     @NonNull OnDoneCallback callback) {
                 try {
-                    mStubListener.onSearchTextChanged(searchText,
+                    mStubCallback.onSearchTextChanged(searchText,
                             RemoteUtils.createOnDoneCallbackStub(callback));
                 } catch (RemoteException e) {
                     throw new WrappedRuntimeException(e);
@@ -423,7 +423,7 @@
             public void onSearchSubmitted(@NonNull String searchText,
                     @NonNull OnDoneCallback callback) {
                 try {
-                    mStubListener.onSearchSubmitted(searchText,
+                    mStubCallback.onSearchSubmitted(searchText,
                             RemoteUtils.createOnDoneCallbackStub(callback));
                 } catch (RemoteException e) {
                     throw new WrappedRuntimeException(e);
@@ -433,24 +433,24 @@
     }
 
     @Keep // We need to keep these stub for Bundler serialization logic.
-    private static class SearchListenerStub extends ISearchListener.Stub {
-        private final SearchListener mSearchListener;
+    private static class SearchCallbackStub extends ISearchCallback.Stub {
+        private final SearchCallback mSearchCallback;
 
-        SearchListenerStub(SearchListener searchListener) {
-            mSearchListener = searchListener;
+        SearchCallbackStub(SearchCallback searchCallback) {
+            mSearchCallback = searchCallback;
         }
 
         @Override
         public void onSearchTextChanged(String text, IOnDoneCallback callback) {
             RemoteUtils.dispatchHostCall(
-                    () -> mSearchListener.onSearchTextChanged(text), callback,
+                    () -> mSearchCallback.onSearchTextChanged(text), callback,
                     "onSearchTextChanged");
         }
 
         @Override
         public void onSearchSubmitted(String text, IOnDoneCallback callback) {
             RemoteUtils.dispatchHostCall(
-                    () -> mSearchListener.onSearchSubmitted(text), callback, "onSearchSubmitted");
+                    () -> mSearchCallback.onSearchSubmitted(text), callback, "onSearchSubmitted");
         }
     }
 }
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 0cbe903..b995bb9 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
@@ -17,7 +17,10 @@
 package androidx.car.app.model.constraints;
 
 
+import static androidx.annotation.RestrictTo.Scope;
+
 import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.Action.ActionType;
@@ -30,7 +33,10 @@
 
 /**
  * Encapsulates the constraints to apply when rendering a list of {@link Action}s on a template.
+ *
+ * @hide
  */
+@RestrictTo(Scope.LIBRARY)
 public class ActionsConstraints {
 
     /** Conservative constraints for most template types. */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/constraints/CarColorConstraints.java b/car/app/app/src/main/java/androidx/car/app/model/constraints/CarColorConstraints.java
index 489022b..ae9e383 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/constraints/CarColorConstraints.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/constraints/CarColorConstraints.java
@@ -16,7 +16,10 @@
 
 package androidx.car.app.model.constraints;
 
+import static androidx.annotation.RestrictTo.Scope;
+
 import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.CarColor.CarColorType;
 
@@ -24,7 +27,10 @@
 
 /**
  * Encapsulates the constraints to apply when rendering a {@link CarColor} on a template.
+ *
+ * @hide
  */
+@RestrictTo(Scope.LIBRARY)
 public class CarColorConstraints {
 
     @NonNull
diff --git a/car/app/app/src/main/java/androidx/car/app/model/constraints/CarIconConstraints.java b/car/app/app/src/main/java/androidx/car/app/model/constraints/CarIconConstraints.java
index 2b9353c..c9cafe0 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/constraints/CarIconConstraints.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/constraints/CarIconConstraints.java
@@ -20,12 +20,16 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.car.app.model.CarIcon;
 import androidx.core.graphics.drawable.IconCompat;
 
 /**
  * Encapsulates the constraints to apply when rendering a {@link CarIcon} on a template.
+ *
+ * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
 public class CarIconConstraints {
     /** Allow all custom icon types. */
     @NonNull
diff --git a/car/app/app/src/main/java/androidx/car/app/model/constraints/RowConstraints.java b/car/app/app/src/main/java/androidx/car/app/model/constraints/RowConstraints.java
index 0a0ab91..7c901b1 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/constraints/RowConstraints.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/constraints/RowConstraints.java
@@ -17,13 +17,16 @@
 package androidx.car.app.model.constraints;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.Row;
 
 /**
- * Encapsulates the constraints to apply when rendering a {@link
- * androidx.car.app.model.Row} in different contexts.
+ * Encapsulates the constraints to apply when rendering a {@link Row} in different contexts.
+ *
+ * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
 public class RowConstraints {
     @NonNull
     public static final RowConstraints UNCONSTRAINED = RowConstraints.builder().build();
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 a6b76e9..bece6fc 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
@@ -16,13 +16,11 @@
 
 package androidx.car.app.model.constraints;
 
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.car.app.model.constraints.RowConstraints.ROW_CONSTRAINTS_CONSERVATIVE;
 import static androidx.car.app.model.constraints.RowConstraints.ROW_CONSTRAINTS_FULL_LIST;
 import static androidx.car.app.model.constraints.RowConstraints.ROW_CONSTRAINTS_PANE;
 import static androidx.car.app.model.constraints.RowConstraints.ROW_CONSTRAINTS_SIMPLE;
 
-import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.model.ActionList;
@@ -30,41 +28,20 @@
 import androidx.car.app.model.Pane;
 import androidx.car.app.model.SectionedItemList;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Encapsulates the constraints to apply when rendering a row list under different contexts.
+ *
+ * @hide
  */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
 public class RowListConstraints {
-    /**
-     * The RowList that is used for max row.
-     *
-     * @hide
-     */
-    // TODO(shiufai): investigate how to expose IntDefs if needed.
-    @IntDef(value = {DEFAULT_LIST, PANE, ROUTE_PREVIEW})
-    @RestrictTo(LIBRARY)
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ListType {
-    }
-
-    @ListType
-    public static final int DEFAULT_LIST = 0;
-
-    @ListType
-    public static final int PANE = 1;
-
-    @ListType
-    public static final int ROUTE_PREVIEW = 2;
-
     /** Conservative constraints for all types lists. */
     @NonNull
     public static final RowListConstraints ROW_LIST_CONSTRAINTS_CONSERVATIVE =
             RowListConstraints.builder()
-                    .setRowListType(DEFAULT_LIST)
                     .setMaxActions(0)
                     .setRowConstraints(ROW_CONSTRAINTS_CONSERVATIVE)
                     .setAllowSelectableLists(false)
@@ -76,7 +53,6 @@
             ROW_LIST_CONSTRAINTS_CONSERVATIVE
                     .newBuilder()
                     .setMaxActions(2)
-                    .setRowListType(PANE)
                     .setRowConstraints(ROW_CONSTRAINTS_PANE)
                     .setAllowSelectableLists(false)
                     .build();
@@ -94,7 +70,6 @@
     public static final RowListConstraints ROW_LIST_CONSTRAINTS_ROUTE_PREVIEW =
             ROW_LIST_CONSTRAINTS_CONSERVATIVE
                     .newBuilder()
-                    .setRowListType(ROUTE_PREVIEW)
                     .setRowConstraints(ROW_CONSTRAINTS_SIMPLE)
                     .setAllowSelectableLists(true)
                     .build();
@@ -108,15 +83,13 @@
                     .setAllowSelectableLists(true)
                     .build();
 
-    @ListType
-    private final int mRowListType;
     private final int mMaxActions;
     private final RowConstraints mRowConstraints;
     private final boolean mAllowSelectableLists;
 
     /** A builder of {@link RowListConstraints}. */
     @NonNull
-    public static Builder builder() {
+    public static RowListConstraints.Builder builder() {
         return new Builder();
     }
 
@@ -126,12 +99,6 @@
         return new Builder(this);
     }
 
-    /** Returns the row list type for this constraint. */
-    @ListType
-    public int getRowListType() {
-        return mRowListType;
-    }
-
     /** Returns the maximum number of actions allowed to be added alongside the list. */
     public int getMaxActions() {
         return mMaxActions;
@@ -209,26 +176,16 @@
         mMaxActions = builder.mMaxActions;
         mRowConstraints = builder.mRowConstraints;
         mAllowSelectableLists = builder.mAllowSelectableLists;
-        mRowListType = builder.mRowListType;
     }
 
     /**
      * A builder of {@link RowListConstraints}.
      */
     public static final class Builder {
-        @ListType
-        int mRowListType;
         int mMaxActions;
         RowConstraints mRowConstraints = RowConstraints.UNCONSTRAINED;
         boolean mAllowSelectableLists;
 
-        /** Sets the row list type for this constraint. */
-        @NonNull
-        public Builder setRowListType(@ListType int rowListType) {
-            this.mRowListType = rowListType;
-            return this;
-        }
-
         /** Sets the maximum number of actions allowed to be added alongside the list. */
         @NonNull
         public Builder setMaxActions(int maxActions) {
@@ -265,7 +222,6 @@
             this.mMaxActions = constraints.getMaxActions();
             this.mRowConstraints = constraints.getRowConstraints();
             this.mAllowSelectableLists = constraints.isAllowSelectableLists();
-            this.mRowListType = constraints.getRowListType();
         }
     }
 }
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManager.java b/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManager.java
index 2b78cae..efed8b9 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManager.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManager.java
@@ -54,8 +54,8 @@
  * to end navigation or when the destination is reached, {@link #navigationEnded()} should be
  * called.
  *
- * <p>Navigation apps must also register a {@link NavigationManagerListener} to handle callbacks to
- * {@link NavigationManagerListener#onStopNavigation()} issued by the host.
+ * <p>Navigation apps must also register a {@link NavigationManagerCallback} to handle callbacks to
+ * {@link NavigationManagerCallback#onStopNavigation()} issued by the host.
  */
 public class NavigationManager {
     private static final String TAG = "NavigationManager";
@@ -66,9 +66,9 @@
 
     // Guarded by main thread access.
     @Nullable
-    private NavigationManagerListener mNavigationManagerListener;
+    private NavigationManagerCallback mNavigationManagerCallback;
     @Nullable
-    private Executor mNavigationManagerListenerExecutor;
+    private Executor mNavigationManagerCallbackExecutor;
     private boolean mIsNavigating;
     private boolean mIsAutoDriveEnabled;
 
@@ -81,7 +81,7 @@
      * <p>This method should only be invoked once the navigation app has called {@link
      * #navigationStarted()}, or else the updates will be dropped by the host. Once the app has
      * called {@link #navigationEnded()} or received
-     * {@link NavigationManagerListener#onStopNavigation()} it should stop sending updates.
+     * {@link NavigationManagerCallback#onStopNavigation()} it should stop sending updates.
      *
      * <p>As the location changes, and in accordance with speed and rounded distance changes, the
      * {@link TravelEstimate}s in the provided {@link Trip} should be rebuilt and this method called
@@ -94,7 +94,6 @@
      * displays the associated icon may be shown.
      *
      * @param trip destination, steps, and trip estimates to be sent to the host
-     *
      * @throws HostException            if the call is invoked by an app that is not declared as
      *                                  a navigation app in the manifest
      * @throws IllegalStateException    if the call occurs when navigation is not started. See
@@ -127,59 +126,57 @@
     }
 
     /**
-     * Sets a listener to start receiving navigation manager events.
+     * Sets a callback to start receiving navigation manager events.
      *
-     * Note that the listener will be executed on the main thread using
+     * Note that the callback events will be executed on the main thread using
      * {@link Looper#getMainLooper()}. To specify the execution thread, use
-     * {@link #setNavigationManagerListener(Executor, NavigationManagerListener)}.
+     * {@link #setNavigationManagerCallback(Executor, NavigationManagerCallback)}.
      *
-     * @param listener the {@link NavigationManagerListener} to use
-     *
+     * @param callback the {@link NavigationManagerCallback} to use
      * @throws IllegalStateException if the current thread is not the main thread
      */
     @SuppressLint("ExecutorRegistration")
     @MainThread
-    public void setNavigationManagerListener(@NonNull NavigationManagerListener listener) {
+    public void setNavigationManagerCallback(@NonNull NavigationManagerCallback callback) {
         checkMainThread();
         Executor executor = ContextCompat.getMainExecutor(mCarContext);
-        setNavigationManagerListener(executor, listener);
+        setNavigationManagerCallback(executor, callback);
     }
 
     /**
-     * Sets a listener to start receiving navigation manager events.
+     * Sets a callback to start receiving navigation manager events.
      *
-     * @param executor the executor which will be used for invoking the listener
-     * @param listener the {@link NavigationManagerListener} to use
-     *
+     * @param executor the executor which will be used for invoking the callback
+     * @param callback the {@link NavigationManagerCallback} to use
      * @throws IllegalStateException if the current thread is not the main thread.
      */
     @MainThread
-    public void setNavigationManagerListener(@NonNull /* @CallbackExecutor */ Executor executor,
-            @NonNull NavigationManagerListener listener) {
+    public void setNavigationManagerCallback(@NonNull /* @CallbackExecutor */ Executor executor,
+            @NonNull NavigationManagerCallback callback) {
         checkMainThread();
 
-        mNavigationManagerListenerExecutor = executor;
-        mNavigationManagerListener = listener;
+        mNavigationManagerCallbackExecutor = executor;
+        mNavigationManagerCallback = callback;
         if (mIsAutoDriveEnabled) {
             onAutoDriveEnabled();
         }
     }
 
     /**
-     * Clears the listener for receiving navigation manager events.
+     * Clears the callback for receiving navigation manager events.
      *
      * @throws IllegalStateException if navigation is started. See
      *                               {@link #navigationStarted()} for more info.
      * @throws IllegalStateException if the current thread is not the main thread.
      */
     @MainThread
-    public void clearNavigationManagerListener() {
+    public void clearNavigationManagerCallback() {
         checkMainThread();
         if (mIsNavigating) {
-            throw new IllegalStateException("Removing listener while navigating");
+            throw new IllegalStateException("Removing callback while navigating");
         }
-        mNavigationManagerListenerExecutor = null;
-        mNavigationManagerListener = null;
+        mNavigationManagerCallbackExecutor = null;
+        mNavigationManagerCallback = null;
     }
 
     /**
@@ -190,14 +187,14 @@
      * navigation in response to user action.
      *
      * <p>This function can only called if
-     * {@link #setNavigationManagerListener(NavigationManagerListener)} has been
-     * called with a non-{@code null} value. The listener is required so that a signal to stop
+     * {@link #setNavigationManagerCallback(NavigationManagerCallback)} has been
+     * called with a non-{@code null} value. The callback is required so that a signal to stop
      * navigation from the host can be handled using
-     * {@link NavigationManagerListener#onStopNavigation()}.
+     * {@link NavigationManagerCallback#onStopNavigation()}.
      *
      * <p>This method is idempotent.
      *
-     * @throws IllegalStateException if no navigation manager listener has been set.
+     * @throws IllegalStateException if no navigation manager callback has been set.
      * @throws IllegalStateException if the current thread is not the main thread.
      */
     @MainThread
@@ -206,8 +203,8 @@
         if (mIsNavigating) {
             return;
         }
-        if (mNavigationManagerListener == null) {
-            throw new IllegalStateException("No listener has been set");
+        if (mNavigationManagerCallback == null) {
+            throw new IllegalStateException("No callback has been set");
         }
         mIsNavigating = true;
         mHostDispatcher.dispatch(
@@ -282,8 +279,8 @@
             return;
         }
         mIsNavigating = false;
-        requireNonNull(mNavigationManagerListenerExecutor).execute(() -> {
-            requireNonNull(mNavigationManagerListener).onStopNavigation();
+        requireNonNull(mNavigationManagerCallbackExecutor).execute(() -> {
+            requireNonNull(mNavigationManagerCallback).onStopNavigation();
         });
     }
 
@@ -301,13 +298,13 @@
     public void onAutoDriveEnabled() {
         checkMainThread();
         mIsAutoDriveEnabled = true;
-        if (mNavigationManagerListener != null) {
+        if (mNavigationManagerCallback != null) {
             Log.d(TAG, "Executing onAutoDriveEnabled");
-            requireNonNull(mNavigationManagerListenerExecutor).execute(() -> {
-                mNavigationManagerListener.onAutoDriveEnabled();
+            requireNonNull(mNavigationManagerCallbackExecutor).execute(() -> {
+                mNavigationManagerCallback.onAutoDriveEnabled();
             });
         } else {
-            Log.w(TAG, "NavigationManagerListener not set, skipping onAutoDriveEnabled");
+            Log.w(TAG, "NavigationManagerCallback not set, skipping onAutoDriveEnabled");
         }
     }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManagerListener.java b/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManagerCallback.java
similarity index 93%
rename from car/app/app/src/main/java/androidx/car/app/navigation/NavigationManagerListener.java
rename to car/app/app/src/main/java/androidx/car/app/navigation/NavigationManagerCallback.java
index fa2475c..1a44e6c 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManagerListener.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/NavigationManagerCallback.java
@@ -20,11 +20,11 @@
 import androidx.car.app.navigation.model.Trip;
 
 /**
- * Listener for events from the {@link NavigationManager}.
+ * Callback for events from the {@link NavigationManager}.
  *
  * @see NavigationManager
  */
-public interface NavigationManagerListener {
+public interface NavigationManagerCallback {
     /**
      * Notifies the app to stop active navigation, which may occurs when another source such as the
      * car head unit starts navigating.
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
index 25c44d0..25650aa 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
@@ -28,7 +28,7 @@
 import androidx.annotation.Nullable;
 import androidx.car.app.CarAppPermission;
 import androidx.car.app.Screen;
-import androidx.car.app.SurfaceListener;
+import androidx.car.app.SurfaceCallback;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarColor;
@@ -52,7 +52,7 @@
  * host with a new template with the updated information.
  *
  * <p>The template itself does not expose a drawing surface. In order to draw on the canvas, use
- * {@link androidx.car.app.AppManager#setSurfaceListener(SurfaceListener)}.
+ * {@link androidx.car.app.AppManager#setSurfaceCallback(SurfaceCallback)}.
  *
  * <p>See {@code androidx.car.app.notification.CarAppExtender} for how to show
  * alerts with notifications. Frequent alert notifications distract the driver and are discouraged.
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
index f2fbac1..a9bd2ef 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
@@ -25,10 +25,9 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
 import androidx.car.app.CarAppPermission;
 import androidx.car.app.Screen;
-import androidx.car.app.SurfaceListener;
+import androidx.car.app.SurfaceCallback;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarText;
@@ -49,7 +48,7 @@
  * A template that supports showing a list of places alongside a custom drawn map.
  *
  * <p>The template itself does not expose a drawing surface. In order to draw on the canvas, use
- * {@link androidx.car.app.AppManager#setSurfaceListener(SurfaceListener)}.
+ * {@link androidx.car.app.AppManager#setSurfaceCallback(SurfaceCallback)}.
  *
  * <h4>Template Restrictions</h4>
  *
@@ -260,18 +259,6 @@
         }
 
         /**
-         * Sets an {@link ItemList} for the template. This method does not enforce the
-         * template's requirements and is only intended for testing purposes.
-         */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        @VisibleForTesting
-        @NonNull
-        public Builder setItemListForTesting(@Nullable ItemList itemList) {
-            this.mItemList = itemList;
-            return this;
-        }
-
-        /**
          * Sets the {@link ActionStrip} for this template, or {@code null} to not show an {@link
          * ActionStrip}.
          *
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 b10afbe..28995c1 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
@@ -27,10 +27,9 @@
 import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
 import androidx.car.app.CarAppPermission;
 import androidx.car.app.Screen;
-import androidx.car.app.SurfaceListener;
+import androidx.car.app.SurfaceCallback;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
 import androidx.car.app.model.CarText;
@@ -59,7 +58,7 @@
  * </ol>
  *
  * <p>The template itself does not expose a drawing surface. In order to draw on the canvas, use
- * {@link androidx.car.app.AppManager#setSurfaceListener(SurfaceListener)}.
+ * {@link androidx.car.app.AppManager#setSurfaceCallback(SurfaceCallback)}.
  *
  * <h4>Template Restrictions</h4>
  *
@@ -306,18 +305,6 @@
         }
 
         /**
-         * Sets an {@link ItemList} for the template. This method does not enforce the
-         * template's requirements and is only intended for testing purposes.
-         */
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        @VisibleForTesting
-        @NonNull
-        public Builder setItemListForTesting(@Nullable ItemList itemList) {
-            this.mItemList = itemList;
-            return this;
-        }
-
-        /**
          * Sets the {@link ActionStrip} for this template, or {@code null} to not show an {@link
          * ActionStrip}.
          *
diff --git a/car/app/app/src/main/java/androidx/car/app/utils/CommonUtils.java b/car/app/app/src/main/java/androidx/car/app/utils/CommonUtils.java
index bbf1bac..1e00485 100644
--- a/car/app/app/src/main/java/androidx/car/app/utils/CommonUtils.java
+++ b/car/app/app/src/main/java/androidx/car/app/utils/CommonUtils.java
@@ -28,7 +28,7 @@
 @RestrictTo(LIBRARY)
 public final class CommonUtils {
     /** Tag to use for logging in the library. */
-    public static final String TAG = "car.app";
+    public static final String TAG = "CarApp";
 
     private CommonUtils() {
     }
diff --git a/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java b/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java
index 09d87e2..da69f8f 100644
--- a/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java
+++ b/car/app/app/src/main/java/androidx/car/app/utils/RemoteUtils.java
@@ -30,10 +30,10 @@
 import androidx.car.app.FailureResponse;
 import androidx.car.app.HostException;
 import androidx.car.app.IOnDoneCallback;
-import androidx.car.app.ISurfaceListener;
+import androidx.car.app.ISurfaceCallback;
 import androidx.car.app.OnDoneCallback;
+import androidx.car.app.SurfaceCallback;
 import androidx.car.app.SurfaceContainer;
-import androidx.car.app.SurfaceListener;
 import androidx.car.app.WrappedRuntimeException;
 import androidx.car.app.serialization.Bundleable;
 import androidx.car.app.serialization.BundlerException;
@@ -84,33 +84,33 @@
     }
 
     /**
-     * Returns an {@link ISurfaceListener} stub that invokes the given {@link SurfaceListener},
+     * Returns an {@link ISurfaceCallback} stub that invokes the given {@link SurfaceCallback},
      * if it is not {@code null}, otherwise returns {@code null}.
      */
     @Nullable
-    public static ISurfaceListener stubSurfaceListener(@Nullable SurfaceListener surfaceListener) {
-        if (surfaceListener == null) {
+    public static ISurfaceCallback stubSurfaceCallback(@Nullable SurfaceCallback surfaceCallback) {
+        if (surfaceCallback == null) {
             return null;
         }
 
-        return new SurfaceListenerStub(surfaceListener);
+        return new SurfaceCallbackStub(surfaceCallback);
     }
 
     private RemoteUtils() {
     }
 
-    private static class SurfaceListenerStub extends ISurfaceListener.Stub {
+    private static class SurfaceCallbackStub extends ISurfaceCallback.Stub {
 
-        private final SurfaceListener mSurfaceListener;
+        private final SurfaceCallback mSurfaceCallback;
 
-        SurfaceListenerStub(SurfaceListener surfaceListener) {
-            this.mSurfaceListener = surfaceListener;
+        SurfaceCallbackStub(SurfaceCallback surfaceCallback) {
+            this.mSurfaceCallback = surfaceCallback;
         }
 
         @Override
         public void onSurfaceAvailable(Bundleable surfaceContainer, IOnDoneCallback callback) {
             dispatchHostCall(
-                    () -> mSurfaceListener.onSurfaceAvailable(
+                    () -> mSurfaceCallback.onSurfaceAvailable(
                             (SurfaceContainer) surfaceContainer.get()),
                     callback,
                     "onSurfaceAvailable");
@@ -119,7 +119,7 @@
         @Override
         public void onVisibleAreaChanged(Rect visibleArea, IOnDoneCallback callback) {
             dispatchHostCall(
-                    () -> mSurfaceListener.onVisibleAreaChanged(visibleArea),
+                    () -> mSurfaceCallback.onVisibleAreaChanged(visibleArea),
                     callback,
                     "onVisibleAreaChanged");
         }
@@ -127,14 +127,14 @@
         @Override
         public void onStableAreaChanged(Rect stableArea, IOnDoneCallback callback) {
             dispatchHostCall(
-                    () -> mSurfaceListener.onStableAreaChanged(stableArea), callback,
+                    () -> mSurfaceCallback.onStableAreaChanged(stableArea), callback,
                     "onStableAreaChanged");
         }
 
         @Override
         public void onSurfaceDestroyed(Bundleable surfaceContainer, IOnDoneCallback callback) {
             dispatchHostCall(
-                    () -> mSurfaceListener.onSurfaceDestroyed(
+                    () -> mSurfaceCallback.onSurfaceDestroyed(
                             (SurfaceContainer) surfaceContainer.get()),
                     callback,
                     "onSurfaceDestroyed");
diff --git a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
index 21c453b..1aeda53 100644
--- a/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
+++ b/car/app/app/src/main/java/androidx/car/app/versioning/CarAppApiLevels.java
@@ -39,18 +39,6 @@
     public static final int LEVEL_1 = 1;
 
     /**
-     * Lowest API level implement to this library
-     */
-    @CarAppApiLevel
-    public static final int OLDEST = LEVEL_1;
-
-    /**
-     * Highest API level implemented by this library.
-     */
-    @CarAppApiLevel
-    public static final int LATEST = LEVEL_1;
-
-    /**
      * Unknown API level. Used when the API level hasn't been established yet
      *
      * @hide
@@ -66,7 +54,23 @@
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY)
     public static boolean isValid(int carApiLevel) {
-        return carApiLevel >= OLDEST && carApiLevel <= LATEST;
+        return carApiLevel >= getOldest() && carApiLevel <= getLatest();
+    }
+
+    /**
+     * Highest API level implemented by this library.
+     */
+    @CarAppApiLevel
+    public static int getLatest() {
+        return LEVEL_1;
+    }
+
+    /**
+     * Lowest API level implement to this library
+     */
+    @CarAppApiLevel
+    public static int getOldest() {
+        return LEVEL_1;
     }
 
     private CarAppApiLevels() {}
diff --git a/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java b/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java
index 8b6f797..84c7d9f 100644
--- a/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/AppInfoTest.java
@@ -59,12 +59,12 @@
     public void create_minApiLevel_defaultsToCurrent() {
         mApplicationInfo.metaData = null;
         AppInfo appInfo = AppInfo.create(mContext);
-        assertThat(appInfo.getMinCarAppApiLevel()).isEqualTo(CarAppApiLevels.LATEST);
+        assertThat(appInfo.getMinCarAppApiLevel()).isEqualTo(CarAppApiLevels.getLatest());
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void create_minApiLevel_cannotBeLowerThanOldest() {
-        int minApiLevel = CarAppApiLevels.OLDEST - 1;
+        int minApiLevel = CarAppApiLevels.getOldest() - 1;
         mApplicationInfo.metaData = new Bundle();
         mApplicationInfo.metaData.putInt(AppInfo.MIN_API_LEVEL_MANIFEST_KEY, minApiLevel);
         AppInfo.create(mContext);
@@ -72,7 +72,7 @@
 
     @Test(expected = IllegalArgumentException.class)
     public void create_minApiLevel_cannotBeHigherThanLatest() {
-        int minApiLevel = CarAppApiLevels.LATEST + 1;
+        int minApiLevel = CarAppApiLevels.getLatest() + 1;
         mApplicationInfo.metaData = new Bundle();
         mApplicationInfo.metaData.putInt(AppInfo.MIN_API_LEVEL_MANIFEST_KEY, minApiLevel);
         AppInfo.create(mContext);
diff --git a/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java b/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
index 57e4c35..941c03e 100644
--- a/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/AppManagerTest.java
@@ -77,9 +77,9 @@
                     }
 
                     @Override
-                    public void setSurfaceListener(@Nullable ISurfaceListener surfaceListener)
+                    public void setSurfaceCallback(@Nullable ISurfaceCallback surfaceCallback)
                             throws RemoteException {
-                        mMockAppHost.setSurfaceListener(surfaceListener);
+                        mMockAppHost.setSurfaceCallback(surfaceCallback);
                     }
                 };
         when(mMockCarHost.getHost(any())).thenReturn(appHost.asBinder());
@@ -158,32 +158,32 @@
 
     @Test
     public void setSurfaceListener_forwardsRequestToHost() throws RemoteException {
-        mAppManager.setSurfaceListener(null);
+        mAppManager.setSurfaceCallback(null);
 
-        verify(mMockAppHost).setSurfaceListener(null);
+        verify(mMockAppHost).setSurfaceCallback(null);
     }
 
     @Test
     public void setSurfaceListener_hostThrowsSecurityException_throwsSecurityException()
             throws RemoteException {
-        doThrow(new SecurityException()).when(mMockAppHost).setSurfaceListener(any());
+        doThrow(new SecurityException()).when(mMockAppHost).setSurfaceCallback(any());
 
-        assertThrows(SecurityException.class, () -> mAppManager.setSurfaceListener(null));
+        assertThrows(SecurityException.class, () -> mAppManager.setSurfaceCallback(null));
     }
 
     @Test
     public void etSurfaceListener_hostThrowsRemoteException_throwsHostException()
             throws RemoteException {
-        doThrow(new RemoteException()).when(mMockAppHost).setSurfaceListener(any());
+        doThrow(new RemoteException()).when(mMockAppHost).setSurfaceCallback(any());
 
-        assertThrows(HostException.class, () -> mAppManager.setSurfaceListener(null));
+        assertThrows(HostException.class, () -> mAppManager.setSurfaceCallback(null));
     }
 
     @Test
     public void setSurfaceListener_hostThrowsRuntimeException_throwsHostException()
             throws RemoteException {
-        doThrow(new IllegalStateException()).when(mMockAppHost).setSurfaceListener(any());
+        doThrow(new IllegalStateException()).when(mMockAppHost).setSurfaceCallback(any());
 
-        assertThrows(HostException.class, () -> mAppManager.setSurfaceListener(null));
+        assertThrows(HostException.class, () -> mAppManager.setSurfaceCallback(null));
     }
 }
diff --git a/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java b/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java
index d5a80dd..918de32 100644
--- a/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/CarAppServiceTest.java
@@ -226,7 +226,8 @@
                 .isEqualTo(appInfo.getMinCarAppApiLevel());
         assertThat(receivedAppInfo.getLatestCarAppApiLevel())
                 .isEqualTo(appInfo.getLatestCarAppApiLevel());
-        assertThat(receivedAppInfo.getLibraryVersion()).isEqualTo(appInfo.getLibraryVersion());
+        assertThat(receivedAppInfo.getLibraryDisplayVersion()).isEqualTo(
+                appInfo.getLibraryDisplayVersion());
     }
 
     @Test
diff --git a/car/app/app/src/test/java/androidx/car/app/CarContextTest.java b/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
index 3db83de..a0d08c2 100644
--- a/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/CarContextTest.java
@@ -94,7 +94,7 @@
                             }
 
                             @Override
-                            public void setSurfaceListener(@Nullable ISurfaceListener listener) {
+                            public void setSurfaceCallback(@Nullable ISurfaceCallback callback) {
                             }
                         }.asBinder());
 
diff --git a/car/app/app/src/test/java/androidx/car/app/HostDispatcherTest.java b/car/app/app/src/test/java/androidx/car/app/HostDispatcherTest.java
index 1366265..f0abe7e 100644
--- a/car/app/app/src/test/java/androidx/car/app/HostDispatcherTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/HostDispatcherTest.java
@@ -72,9 +72,9 @@
                     }
 
                     @Override
-                    public void setSurfaceListener(@Nullable ISurfaceListener surfaceListener)
+                    public void setSurfaceCallback(@Nullable ISurfaceCallback surfaceCallback)
                             throws RemoteException {
-                        mMockAppHost.setSurfaceListener(surfaceListener);
+                        mMockAppHost.setSurfaceCallback(surfaceCallback);
                     }
                 };
 
diff --git a/car/app/app/src/test/java/androidx/car/app/model/SearchTemplateTest.java b/car/app/app/src/test/java/androidx/car/app/model/SearchTemplateTest.java
index 9126708..c837406 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/SearchTemplateTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/SearchTemplateTest.java
@@ -47,13 +47,13 @@
     public final MockitoRule mockito = MockitoJUnit.rule();
 
     @Mock
-    SearchTemplate.SearchListener mMockSearchListener;
+    SearchTemplate.SearchCallback mMockSearchCallback;
 
     @Test
     public void createInstance_isLoading_hasList_Throws() {
         assertThrows(
                 IllegalArgumentException.class,
-                () -> SearchTemplate.builder(mMockSearchListener)
+                () -> SearchTemplate.builder(mMockSearchCallback)
                         .setLoading(true)
                         .setItemList(ItemList.builder().build())
                         .build());
@@ -63,12 +63,12 @@
     public void addList_selectable_throws() {
         assertThrows(
                 IllegalArgumentException.class,
-                () -> SearchTemplate.builder(mMockSearchListener)
+                () -> SearchTemplate.builder(mMockSearchCallback)
                         .setItemList(TestUtils.createItemList(6, true))
                         .build());
 
         // Positive cases.
-        SearchTemplate.builder(mMockSearchListener)
+        SearchTemplate.builder(mMockSearchCallback)
                 .setItemList(TestUtils.createItemList(6, false))
                 .build();
     }
@@ -82,12 +82,12 @@
                 Row.builder().setTitle("Title").addText("text1").addText("text2").build();
         assertThrows(
                 IllegalArgumentException.class,
-                () -> SearchTemplate.builder(mMockSearchListener)
+                () -> SearchTemplate.builder(mMockSearchCallback)
                         .setItemList(ItemList.builder().addItem(rowExceedsMaxTexts).build())
                         .build());
 
         // Positive cases.
-        SearchTemplate.builder(mMockSearchListener)
+        SearchTemplate.builder(mMockSearchCallback)
                 .setItemList(ItemList.builder().addItem(rowMeetingMaxTexts).build())
                 .build();
     }
@@ -101,19 +101,19 @@
                 Row.builder().setTitle("Title").addText("text1").addText("text2").build();
         assertThrows(
                 IllegalArgumentException.class,
-                () -> SearchTemplate.builder(mMockSearchListener)
+                () -> SearchTemplate.builder(mMockSearchCallback)
                         .setItemList(ItemList.builder().addItem(rowWithToggle).build())
                         .build());
 
         // Positive cases.
-        SearchTemplate.builder(mMockSearchListener)
+        SearchTemplate.builder(mMockSearchCallback)
                 .setItemList(ItemList.builder().addItem(rowMeetingRestrictions).build())
                 .build();
     }
 
     @Test
     public void buildEmpty_nullValues() {
-        SearchTemplate searchTemplate = SearchTemplate.builder(mMockSearchListener).build();
+        SearchTemplate searchTemplate = SearchTemplate.builder(mMockSearchCallback).build();
 
         assertThat(searchTemplate.getInitialSearchText()).isNull();
         assertThat(searchTemplate.getSearchHint()).isNull();
@@ -130,7 +130,7 @@
         ActionStrip actionStrip = ActionStrip.builder().addAction(Action.BACK).build();
 
         SearchTemplate searchTemplate =
-                SearchTemplate.builder(mMockSearchListener)
+                SearchTemplate.builder(mMockSearchCallback)
                         .setHeaderAction(Action.BACK)
                         .setActionStrip(actionStrip)
                         .setInitialSearchText(initialSearchText)
@@ -146,8 +146,8 @@
         assertThat(searchTemplate.getHeaderAction()).isEqualTo(Action.BACK);
 
         String searchText = "foo";
-        searchTemplate.getSearchListener().onSearchSubmitted(searchText, onDoneCallback);
-        verify(mMockSearchListener).onSearchSubmitted(searchText);
+        searchTemplate.getSearchCallback().onSearchSubmitted(searchText, onDoneCallback);
+        verify(mMockSearchCallback).onSearchSubmitted(searchText);
         verify(onDoneCallback).onSuccess(null);
     }
 
@@ -160,7 +160,7 @@
         ActionStrip actionStrip = ActionStrip.builder().addAction(Action.BACK).build();
 
         SearchTemplate searchTemplate =
-                SearchTemplate.builder(mMockSearchListener)
+                SearchTemplate.builder(mMockSearchCallback)
                         .setHeaderAction(Action.BACK)
                         .setActionStrip(actionStrip)
                         .setInitialSearchText(initialSearchText)
@@ -178,16 +178,16 @@
         String searchText = "foo";
         String testExceptionMessage = "Test exception";
         doThrow(new RuntimeException(testExceptionMessage)).when(
-                mMockSearchListener).onSearchSubmitted(searchText);
+                mMockSearchCallback).onSearchSubmitted(searchText);
         OnDoneCallback onDoneCallback = mock(OnDoneCallback.class);
 
         try {
-            searchTemplate.getSearchListener().onSearchSubmitted(searchText, onDoneCallback);
+            searchTemplate.getSearchCallback().onSearchSubmitted(searchText, onDoneCallback);
         } catch (WrappedRuntimeException e) {
             assertThat(e.getMessage()).contains(testExceptionMessage);
         }
 
-        verify(mMockSearchListener).onSearchSubmitted(searchText);
+        verify(mMockSearchCallback).onSearchSubmitted(searchText);
         verify(onDoneCallback).onFailure(any());
     }
 
@@ -195,7 +195,7 @@
     public void createInstance_setHeaderAction_invalidActionThrows() {
         assertThrows(
                 IllegalArgumentException.class,
-                () -> SearchTemplate.builder(mMockSearchListener)
+                () -> SearchTemplate.builder(mMockSearchCallback)
                         .setHeaderAction(
                                 Action.builder().setTitle("Action").setOnClickListener(
                                         () -> {
@@ -205,7 +205,7 @@
     @Test
     public void equals() {
         SearchTemplate template =
-                SearchTemplate.builder(mMockSearchListener)
+                SearchTemplate.builder(mMockSearchCallback)
                         .setHeaderAction(Action.BACK)
                         .setActionStrip(ActionStrip.builder().addAction(Action.BACK).build())
                         .setInitialSearchText("foo")
@@ -217,7 +217,7 @@
 
         assertThat(template)
                 .isEqualTo(
-                        SearchTemplate.builder(mMockSearchListener)
+                        SearchTemplate.builder(mMockSearchCallback)
                                 .setHeaderAction(Action.BACK)
                                 .setActionStrip(
                                         ActionStrip.builder().addAction(Action.BACK).build())
@@ -232,22 +232,22 @@
     @Test
     public void notEquals_differentHeaderAction() {
         SearchTemplate template =
-                SearchTemplate.builder(mMockSearchListener).setHeaderAction(Action.BACK).build();
+                SearchTemplate.builder(mMockSearchCallback).setHeaderAction(Action.BACK).build();
         assertThat(template)
                 .isNotEqualTo(
-                        SearchTemplate.builder(mMockSearchListener).setHeaderAction(
+                        SearchTemplate.builder(mMockSearchCallback).setHeaderAction(
                                 Action.APP_ICON).build());
     }
 
     @Test
     public void notEquals_differentActionStrip() {
         SearchTemplate template =
-                SearchTemplate.builder(mMockSearchListener)
+                SearchTemplate.builder(mMockSearchCallback)
                         .setActionStrip(ActionStrip.builder().addAction(Action.BACK).build())
                         .build();
         assertThat(template)
                 .isNotEqualTo(
-                        SearchTemplate.builder(mMockSearchListener)
+                        SearchTemplate.builder(mMockSearchCallback)
                                 .setActionStrip(
                                         ActionStrip.builder().addAction(Action.APP_ICON).build())
                                 .build());
@@ -256,40 +256,40 @@
     @Test
     public void notEquals_differentInitialSearchText() {
         SearchTemplate template =
-                SearchTemplate.builder(mMockSearchListener).setInitialSearchText("foo").build();
+                SearchTemplate.builder(mMockSearchCallback).setInitialSearchText("foo").build();
         assertThat(template)
                 .isNotEqualTo(
-                        SearchTemplate.builder(mMockSearchListener).setInitialSearchText(
+                        SearchTemplate.builder(mMockSearchCallback).setInitialSearchText(
                                 "bar").build());
     }
 
     @Test
     public void notEquals_differentSearchHint() {
         SearchTemplate template =
-                SearchTemplate.builder(mMockSearchListener).setSearchHint("foo").build();
+                SearchTemplate.builder(mMockSearchCallback).setSearchHint("foo").build();
         assertThat(template)
-                .isNotEqualTo(SearchTemplate.builder(mMockSearchListener).setSearchHint(
+                .isNotEqualTo(SearchTemplate.builder(mMockSearchCallback).setSearchHint(
                         "bar").build());
     }
 
     @Test
     public void notEquals_differentKeyboardEnabled() {
         SearchTemplate template =
-                SearchTemplate.builder(mMockSearchListener).setShowKeyboardByDefault(true).build();
+                SearchTemplate.builder(mMockSearchCallback).setShowKeyboardByDefault(true).build();
         assertThat(template)
                 .isNotEqualTo(
-                        SearchTemplate.builder(mMockSearchListener).setShowKeyboardByDefault(
+                        SearchTemplate.builder(mMockSearchCallback).setShowKeyboardByDefault(
                                 false).build());
     }
 
     @Test
     public void notEquals_differentItemList() {
         SearchTemplate template =
-                SearchTemplate.builder(mMockSearchListener).setItemList(
+                SearchTemplate.builder(mMockSearchCallback).setItemList(
                         ItemList.builder().build()).build();
         assertThat(template)
                 .isNotEqualTo(
-                        SearchTemplate.builder(mMockSearchListener)
+                        SearchTemplate.builder(mMockSearchCallback)
                                 .setItemList(
                                         ItemList.builder().addItem(
                                                 Row.builder().setTitle("Title").build()).build())
diff --git a/car/app/app/src/test/java/androidx/car/app/model/constraints/RowListConstraintsTest.java b/car/app/app/src/test/java/androidx/car/app/model/constraints/RowListConstraintsTest.java
index 131dd52..7e775b5 100644
--- a/car/app/app/src/test/java/androidx/car/app/model/constraints/RowListConstraintsTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/model/constraints/RowListConstraintsTest.java
@@ -33,12 +33,10 @@
     public void validate_itemList_noSelectable() {
         RowListConstraints disallowConstraints =
                 RowListConstraints.builder()
-                        .setRowListType(RowListConstraints.DEFAULT_LIST)
                         .setAllowSelectableLists(false)
                         .build();
         RowListConstraints allowConstraints =
                 RowListConstraints.builder()
-                        .setRowListType(RowListConstraints.DEFAULT_LIST)
                         .setAllowSelectableLists(true)
                         .build();
 
@@ -55,12 +53,10 @@
     public void validate_sectionItemList_noSelectable() {
         RowListConstraints disallowConstraints =
                 RowListConstraints.builder()
-                        .setRowListType(RowListConstraints.DEFAULT_LIST)
                         .setAllowSelectableLists(false)
                         .build();
         RowListConstraints allowConstraints =
                 RowListConstraints.builder()
-                        .setRowListType(RowListConstraints.DEFAULT_LIST)
                         .setAllowSelectableLists(true)
                         .build();
 
@@ -77,7 +73,6 @@
     public void validate_pane_maxActions() {
         RowListConstraints constraints =
                 RowListConstraints.builder()
-                        .setRowListType(RowListConstraints.DEFAULT_LIST)
                         .setMaxActions(2)
                         .build();
 
diff --git a/car/app/app/src/test/java/androidx/car/app/navigation/NavigationManagerTest.java b/car/app/app/src/test/java/androidx/car/app/navigation/NavigationManagerTest.java
index 6605c9b..3571000 100644
--- a/car/app/app/src/test/java/androidx/car/app/navigation/NavigationManagerTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/navigation/NavigationManagerTest.java
@@ -61,7 +61,7 @@
     @Mock
     private INavigationHost.Stub mMockNavHost;
     @Mock
-    private NavigationManagerListener mNavigationListener;
+    private NavigationManagerCallback mNavigationListener;
 
     private final HostDispatcher mHostDispatcher = new HostDispatcher();
     private NavigationManager mNavigationManager;
@@ -124,7 +124,7 @@
     public void navigationStarted_sendState_navigationEnded() throws RemoteException {
         InOrder inOrder = inOrder(mMockNavHost);
 
-        mNavigationManager.setNavigationManagerListener(mNavigationListener);
+        mNavigationManager.setNavigationManagerCallback(mNavigationListener);
         mNavigationManager.navigationStarted();
         inOrder.verify(mMockNavHost).navigationStarted();
 
@@ -143,7 +143,7 @@
     @Test
     public void navigationStarted_multiple() throws RemoteException {
 
-        mNavigationManager.setNavigationManagerListener(mNavigationListener);
+        mNavigationManager.setNavigationManagerCallback(mNavigationListener);
         mNavigationManager.navigationStarted();
 
         mNavigationManager.navigationStarted();
@@ -165,7 +165,7 @@
 
     @Test
     public void onStopNavigation_notNavigating() throws RemoteException {
-        mNavigationManager.setNavigationManagerListener(mNavigationListener);
+        mNavigationManager.setNavigationManagerCallback(mNavigationListener);
         mNavigationManager.getIInterface().onStopNavigation(mock(IOnDoneCallback.class));
         verify(mNavigationListener, never()).onStopNavigation();
     }
@@ -174,7 +174,7 @@
     public void onStopNavigation_navigating_restart() throws RemoteException {
         InOrder inOrder = inOrder(mMockNavHost, mNavigationListener);
 
-        mNavigationManager.setNavigationManagerListener(new SynchronousExecutor(),
+        mNavigationManager.setNavigationManagerCallback(new SynchronousExecutor(),
                 mNavigationListener);
         mNavigationManager.navigationStarted();
         inOrder.verify(mMockNavHost).navigationStarted();
@@ -189,7 +189,7 @@
 
     @Test
     public void onAutoDriveEnabled_callsListener() {
-        mNavigationManager.setNavigationManagerListener(new SynchronousExecutor(),
+        mNavigationManager.setNavigationManagerCallback(new SynchronousExecutor(),
                 mNavigationListener);
         mNavigationManager.onAutoDriveEnabled();
 
@@ -199,7 +199,7 @@
     @Test
     public void onAutoDriveEnabledBeforeRegisteringListener_callsListener() {
         mNavigationManager.onAutoDriveEnabled();
-        mNavigationManager.setNavigationManagerListener(new SynchronousExecutor(),
+        mNavigationManager.setNavigationManagerCallback(new SynchronousExecutor(),
                 mNavigationListener);
 
         verify(mNavigationListener).onAutoDriveEnabled();
diff --git a/car/app/app/src/test/java/androidx/car/app/testing/FakeHost.java b/car/app/app/src/test/java/androidx/car/app/testing/FakeHost.java
index 498870a5..2ceefdb 100644
--- a/car/app/app/src/test/java/androidx/car/app/testing/FakeHost.java
+++ b/car/app/app/src/test/java/androidx/car/app/testing/FakeHost.java
@@ -30,7 +30,7 @@
 import androidx.car.app.CarContext;
 import androidx.car.app.IAppHost;
 import androidx.car.app.ICarHost;
-import androidx.car.app.ISurfaceListener;
+import androidx.car.app.ISurfaceCallback;
 import androidx.car.app.Screen;
 import androidx.car.app.navigation.INavigationHost;
 import androidx.car.app.serialization.Bundleable;
@@ -131,7 +131,7 @@
         }
 
         @Override
-        public void setSurfaceListener(@Nullable ISurfaceListener listener) {
+        public void setSurfaceCallback(@Nullable ISurfaceCallback callback) {
             // No-op.
         }
     }
diff --git a/car/app/app/src/test/java/androidx/car/app/testing/TestAppManager.java b/car/app/app/src/test/java/androidx/car/app/testing/TestAppManager.java
index 9a5b1f0..a843265 100644
--- a/car/app/app/src/test/java/androidx/car/app/testing/TestAppManager.java
+++ b/car/app/app/src/test/java/androidx/car/app/testing/TestAppManager.java
@@ -23,7 +23,7 @@
 import androidx.car.app.AppManager;
 import androidx.car.app.HostDispatcher;
 import androidx.car.app.Screen;
-import androidx.car.app.SurfaceListener;
+import androidx.car.app.SurfaceCallback;
 import androidx.car.app.model.Template;
 
 import java.util.ArrayList;
@@ -35,35 +35,35 @@
  * <p>This class will track the following usages of the {@link AppManager} throughout your test:
  *
  * <ul>
- *   <li>All {@link SurfaceListener}s set via calling {@link AppManager#setSurfaceListener}.
+ *   <li>All {@link SurfaceCallback}s set via calling {@link AppManager#setSurfaceCallback}.
  *   <li>The {@link Template}s returned from {@link Screen#onGetTemplate} due to invalidate calls
  *       via {@link AppManager#invalidate}.
  *   <li>All toasts shown via calling {@link AppManager#showToast}.
  * </ul>
  */
 public class TestAppManager extends AppManager {
-    private final List<SurfaceListener> mSurfaceListeners = new ArrayList<>();
+    private final List<SurfaceCallback> mSurfaceCallbacks = new ArrayList<>();
     private final List<CharSequence> mToastsShown = new ArrayList<>();
     private final List<Pair<Screen, Template>> mTemplatesReturned = new ArrayList<>();
 
     /** Resets the values tracked by this {@link TestAppManager} and all {@link ScreenController}
      * s. */
     public void reset() {
-        mSurfaceListeners.clear();
+        mSurfaceCallbacks.clear();
         mToastsShown.clear();
         mTemplatesReturned.clear();
     }
 
     /**
-     * Retrieves all the {@link SurfaceListener}s set via {@link AppManager#setSurfaceListener}.
+     * Retrieves all the {@link SurfaceCallback}s set via {@link AppManager#setSurfaceCallback}.
      *
      * <p>The listeners are stored in order of calls.
      *
      * <p>The listeners will be stored until {@link #reset} is called.
      */
     @NonNull
-    public List<SurfaceListener> getSurfaceListeners() {
-        return mSurfaceListeners;
+    public List<SurfaceCallback> getSurfaceListeners() {
+        return mSurfaceCallbacks;
     }
 
     /**
@@ -93,8 +93,8 @@
     }
 
     @Override
-    public void setSurfaceListener(@Nullable SurfaceListener surfaceListener) {
-        mSurfaceListeners.add(surfaceListener);
+    public void setSurfaceCallback(@Nullable SurfaceCallback surfaceCallback) {
+        mSurfaceCallbacks.add(surfaceCallback);
     }
 
     @Override
diff --git a/car/app/app/src/test/java/androidx/car/app/testing/navigation/TestNavigationManager.java b/car/app/app/src/test/java/androidx/car/app/testing/navigation/TestNavigationManager.java
index 3892e58..e1b8afa 100644
--- a/car/app/app/src/test/java/androidx/car/app/testing/navigation/TestNavigationManager.java
+++ b/car/app/app/src/test/java/androidx/car/app/testing/navigation/TestNavigationManager.java
@@ -22,7 +22,7 @@
 import androidx.annotation.Nullable;
 import androidx.car.app.HostDispatcher;
 import androidx.car.app.navigation.NavigationManager;
-import androidx.car.app.navigation.NavigationManagerListener;
+import androidx.car.app.navigation.NavigationManagerCallback;
 import androidx.car.app.navigation.model.Trip;
 import androidx.car.app.testing.TestCarContext;
 import androidx.car.app.testing.navigation.model.TripController;
@@ -38,8 +38,8 @@
  *
  * <ul>
  *   <li>All the {@link Trip}s sent via {@link NavigationManager#updateTrip}.
- *   <li>All the {@link NavigationManagerListener}s set via
- *   {@link NavigationManager#setNavigationManagerListener}.
+ *   <li>All the {@link NavigationManagerCallback}s set via
+ *   {@link NavigationManager#setNavigationManagerCallback}.
  *   <li>Count of times that the navigation was started via {@link
  *       NavigationManager#navigationStarted()}.
  *   <li>Count of times that the navigation was ended via {@link NavigationManager#navigationEnded}.
@@ -47,7 +47,7 @@
  */
 public class TestNavigationManager extends NavigationManager {
     private final List<TripController> mTripsSent = new ArrayList<>();
-    private final List<NavigationManagerListener> mListenersSet = new ArrayList<>();
+    private final List<NavigationManagerCallback> mListenersSet = new ArrayList<>();
     private int mNavigationStartedCount;
     private int mNavigationEndedCount;
 
@@ -72,15 +72,15 @@
     }
 
     /**
-     * Retrieves all the {@link NavigationManagerListener}s added via {@link
-     * NavigationManager#setNavigationManagerListener(NavigationManagerListener)}.
+     * Retrieves all the {@link NavigationManagerCallback}s added via {@link
+     * NavigationManager#setNavigationManagerCallback(NavigationManagerCallback)}.
      *
      * <p>The listeners are stored in order of calls.
      *
      * <p>The listeners will be stored until {@link #reset} is called.
      */
     @NonNull
-    public List<NavigationManagerListener> getNavigationManagerCallbacksSet() {
+    public List<NavigationManagerCallback> getNavigationManagerCallbacksSet() {
         return mListenersSet;
     }
 
@@ -107,9 +107,9 @@
     }
 
     @Override
-    public void setNavigationManagerListener(@Nullable NavigationManagerListener listener) {
+    public void setNavigationManagerCallback(@Nullable NavigationManagerCallback listener) {
         mListenersSet.add(listener);
-        super.setNavigationManagerListener(listener);
+        super.setNavigationManagerCallback(listener);
     }
 
     @Override
diff --git a/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java b/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java
index 916e933..2d5f8ec 100644
--- a/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java
+++ b/car/app/app/src/test/java/androidx/car/app/versioning/CarAppApiLevelsTest.java
@@ -28,11 +28,11 @@
 public class CarAppApiLevelsTest {
     @Test
     public void isValid_apiLowerThanOldest_notValid() {
-        assertThat(CarAppApiLevels.isValid(CarAppApiLevels.OLDEST - 1)).isFalse();
+        assertThat(CarAppApiLevels.isValid(CarAppApiLevels.getOldest() - 1)).isFalse();
     }
 
     @Test
     public void isValid_apiHigherThanLatest_notValid() {
-        assertThat(CarAppApiLevels.isValid(CarAppApiLevels.LATEST + 1)).isFalse();
+        assertThat(CarAppApiLevels.isValid(CarAppApiLevels.getOldest() + 1)).isFalse();
     }
 }
diff --git a/collection/README.md b/collection/README.md
index 51cefdc..b4d31f1 100644
--- a/collection/README.md
+++ b/collection/README.md
@@ -7,7 +7,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/collection)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/collection/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/collection/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/classes.html)
 
diff --git a/compose/README.md b/compose/README.md
index 0a2c653..6b2ad38 100644
--- a/compose/README.md
+++ b/compose/README.md
@@ -5,14 +5,14 @@
 ## Syntax
 Jetpack Compose uses composable functions instead of XML layouts to define UI components. You can
 see this in action in the demos, like `androidx.compose.material.demos.ButtonDemo.kt`. More
-information can be found in the [compiler README](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/compose/compiler/README.md).
+information can be found in the [compiler README](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/compiler/README.md).
 
 ## Compiler
 Composable functions are built using a custom Kotlin compiler plugin. More information about the
-compiler plugin is available in [this README](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/compose/compiler/README.md).
+compiler plugin is available in [this README](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/compiler/README.md).
 
 ## Getting started
-To try out Jetpack Compose you need to set up the toolchain for AndroidX development. Follow the process [here](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/README.md) to check out the code.
+To try out Jetpack Compose you need to set up the toolchain for AndroidX development. Follow the process [here](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/README.md) to check out the code.
 
 To start the required version of Android Studio, you need to run the `ANDROIDX_PROJECTS=COMPOSE ./gradlew studio`
 
@@ -36,11 +36,11 @@
 Library code for Jetpack Compose lives under the `frameworks/support/compose` directory. Additionally, sample code can be found within each module in the `integration-tests` subdirectories.
 
 ## Feedback
-To provide feedback or report bugs, please refer to the main [AndroidX contribution guide](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/README.md) and report your bugs [here](https://issuetracker.google.com/issues/new?component=612128)
+To provide feedback or report bugs, please refer to the main [AndroidX contribution guide](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/README.md) and report your bugs [here](https://issuetracker.google.com/issues/new?component=612128)
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/compose)
 
-[Browse source](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:compose/)
+[Browse source](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/)
 
 [Existing open bugs](https://issuetracker.google.com/issues?q=componentid:612128%20status:open)
 
diff --git a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt
index 9800ac3..4dd5e69 100644
--- a/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt
+++ b/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationVectors.kt
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.compose.animation.core
+@file:Suppress("RedundantOverride")
 
-import androidx.compose.ui.util.identityHashCode
+package androidx.compose.animation.core
 
 /**
  * [AnimationVector] class that is the base class of [AnimationVector1D], [AnimationVector2D],
@@ -122,7 +122,7 @@
     override fun equals(other: Any?): Boolean =
         other is AnimationVector1D && other.value == value
 
-    override fun hashCode(): Int = identityHashCode()
+    override fun hashCode(): Int = super.hashCode()
 }
 
 /**
@@ -174,7 +174,7 @@
     override fun equals(other: Any?): Boolean =
         other is AnimationVector2D && other.v1 == v1 && other.v2 == v2
 
-    override fun hashCode(): Int = identityHashCode()
+    override fun hashCode(): Int = super.hashCode()
 }
 
 /**
@@ -237,7 +237,7 @@
     override fun equals(other: Any?): Boolean =
         other is AnimationVector3D && other.v1 == v1 && other.v2 == v2 && other.v3 == v3
 
-    override fun hashCode(): Int = identityHashCode()
+    override fun hashCode(): Int = super.hashCode()
 }
 
 /**
@@ -312,5 +312,5 @@
             other.v3 == v3 &&
             other.v4 == v4
 
-    override fun hashCode(): Int = identityHashCode()
+    override fun hashCode(): Int = super.hashCode()
 }
diff --git a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
index 722150b..bd875f3 100644
--- a/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
+++ b/compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutTest.kt
@@ -255,8 +255,8 @@
         val maxHeight: Dp = Dp.Infinity
     ) {
         init {
-            require(minWidth.isFinite()) { "Constraints#minWidth should be finite" }
-            require(minHeight.isFinite()) { "Constraints#minHeight should be finite" }
+            require(minWidth.isFinite) { "Constraints#minWidth should be finite" }
+            require(minHeight.isFinite) { "Constraints#minHeight should be finite" }
             require(!minWidth.value.isNaN()) { "Constraints#minWidth should not be NaN" }
             require(!maxWidth.value.isNaN()) { "Constraints#maxWidth should not be NaN" }
             require(!minHeight.value.isNaN()) { "Constraints#minHeight should not be NaN" }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt
index 39c7330..55d6b1b 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/AspectRatio.kt
@@ -29,7 +29,7 @@
 import androidx.compose.ui.platform.debugInspectorInfo
 import androidx.compose.ui.unit.Constraints
 import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.unit.satisfiedBy
+import androidx.compose.ui.unit.isSatisfiedBy
 import androidx.compose.ui.util.annotation.FloatRange
 import kotlin.math.roundToInt
 
@@ -158,7 +158,7 @@
             val height = (maxWidth / aspectRatio).roundToInt()
             if (height > 0) {
                 val size = IntSize(maxWidth, height)
-                if (!enforceConstraints || satisfiedBy(size)) {
+                if (!enforceConstraints || isSatisfiedBy(size)) {
                     return size
                 }
             }
@@ -172,7 +172,7 @@
             val width = (maxHeight * aspectRatio).roundToInt()
             if (width > 0) {
                 val size = IntSize(width, maxHeight)
-                if (!enforceConstraints || satisfiedBy(size)) {
+                if (!enforceConstraints || isSatisfiedBy(size)) {
                     return size
                 }
             }
@@ -185,7 +185,7 @@
         val height = (minWidth / aspectRatio).roundToInt()
         if (height > 0) {
             val size = IntSize(minWidth, height)
-            if (!enforceConstraints || satisfiedBy(size)) {
+            if (!enforceConstraints || isSatisfiedBy(size)) {
                 return size
             }
         }
@@ -197,7 +197,7 @@
         val width = (minHeight * aspectRatio).roundToInt()
         if (width > 0) {
             val size = IntSize(width, minHeight)
-            if (!enforceConstraints || satisfiedBy(size)) {
+            if (!enforceConstraints || isSatisfiedBy(size)) {
                 return size
             }
         }
diff --git a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
index 51675bc..537efd3 100644
--- a/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
+++ b/compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/Offset.kt
@@ -90,7 +90,8 @@
  * Offset the content by [offset] px. The offsets can be positive as well as non-positive.
  * Applying an offset only changes the position of the content, without interfering with
  * its size measurement.
- * This modifier is designed to be used for offsets that change, possibly due to user interactions.
+ * This modifier is designed to be used for offsets that change, possibly due to user interactions,
+ * the advantage being that it avoids recomposition when the offset is changing.
  * Note that, even if for convenience the API is accepting [Float] values, these will be rounded
  * to the closest integer value before applying the offset.
  * This modifier will automatically adjust the horizontal offset according to the layout direction.
@@ -130,7 +131,8 @@
  * Offset the content by [offset] px. The offsets can be positive as well as non-positive.
  * Applying an offset only changes the position of the content, without interfering with
  * its size measurement.
- * This modifier is designed to be used for offsets that change, possibly due to user interactions.
+ * This modifier is designed to be used for offsets that change, possibly due to user interactions,
+ * the advantage being that it avoids recomposition when the offset is changing.
  * Note that, even if for convenience the API is accepting [Float] values, these will be rounded
  * to the closest integer value before applying the offset.
  * This modifier will not consider layout direction when calculating the position of the content.
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index 3c042c9..6cdc91d 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -400,6 +400,7 @@
     method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
     method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.Scrollable {
diff --git a/compose/foundation/foundation/api/public_plus_experimental_current.txt b/compose/foundation/foundation/api/public_plus_experimental_current.txt
index 3c042c9..6cdc91d 100644
--- a/compose/foundation/foundation/api/public_plus_experimental_current.txt
+++ b/compose/foundation/foundation/api/public_plus_experimental_current.txt
@@ -400,6 +400,7 @@
     method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
     method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.Scrollable {
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 3c042c9..6cdc91d 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -400,6 +400,7 @@
     method public void item(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
     method public <T> void items(java.util.List<? extends T> items, kotlin.jvm.functions.Function2<? super androidx.compose.foundation.lazy.LazyItemScope,? super T,kotlin.Unit> itemContent);
     method public <T> void itemsIndexed(java.util.List<? extends T> items, kotlin.jvm.functions.Function3<? super androidx.compose.foundation.lazy.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+    method @androidx.compose.foundation.ExperimentalFoundationApi public void stickyHeader(kotlin.jvm.functions.Function1<? super androidx.compose.foundation.lazy.LazyItemScope,kotlin.Unit> content);
   }
 
   @androidx.compose.runtime.Stable public final class LazyListState implements androidx.compose.foundation.gestures.Scrollable {
diff --git a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index f01c619..d46aa5e 100644
--- a/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -44,6 +44,7 @@
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.rememberLazyListState
 import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.samples.StickyHeaderSample
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.integration.demos.common.ComposableDemo
 import androidx.compose.material.AmbientContentColor
@@ -80,6 +81,7 @@
     ComposableDemo("Rtl list") { RtlListDemo() },
     ComposableDemo("LazyColumn DSL") { LazyColumnScope() },
     ComposableDemo("LazyRow DSL") { LazyRowScope() },
+    ComposableDemo("LazyColumn with sticky headers") { StickyHeaderSample() },
     ComposableDemo("Arrangements") { LazyListArrangements() },
     ComposableDemo("Reverse scroll direction") { ReverseLayout() },
     ComposableDemo("Nested lazy lists") { NestedLazyDemo() },
diff --git a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
index 93a4438..1b71a259 100644
--- a/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
+++ b/compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/LazyDslSamples.kt
@@ -17,10 +17,17 @@
 package androidx.compose.foundation.samples
 
 import androidx.annotation.Sampled
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
 
 @Sampled
 @Composable
@@ -62,4 +69,25 @@
             Text("Item at index $index is $item")
         }
     }
-}
\ No newline at end of file
+}
+
+@OptIn(ExperimentalFoundationApi::class)
+@Sampled
+@Composable
+fun StickyHeaderSample() {
+    val sections = listOf("A", "B", "C", "D", "E", "F", "G")
+
+    LazyColumn {
+        sections.forEach { section ->
+            stickyHeader {
+                Text(
+                    "Section $section",
+                    Modifier.fillMaxWidth().background(Color.LightGray).padding(8.dp)
+                )
+            }
+            items((0..9).toList()) {
+                Text("Item $it from the section $section")
+            }
+        }
+    }
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListHeadersTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListHeadersTest.kt
new file mode 100644
index 0000000..171c2911
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyListHeadersTest.kt
@@ -0,0 +1,337 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.lazy
+
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalFoundationApi::class)
+class LazyListHeadersTest {
+
+    private val LazyListTag = "LazyList"
+
+    @get:Rule
+    val rule = createComposeRule()
+
+    @Test
+    fun lazyColumnShowsHeader() {
+        val items = (1..2).map { it.toString() }
+        val firstHeaderTag = "firstHeaderTag"
+        val secondHeaderTag = "secondHeaderTag"
+
+        rule.setContent {
+            LazyColumn(Modifier.preferredHeight(300.dp)) {
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredHeight(101.dp).fillParentMaxWidth()
+                            .testTag(firstHeaderTag)
+                    )
+                }
+
+                items(items) {
+                    Spacer(Modifier.preferredHeight(101.dp).fillParentMaxWidth().testTag(it))
+                }
+
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredHeight(101.dp).fillParentMaxWidth()
+                            .testTag(secondHeaderTag)
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag(firstHeaderTag)
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag(secondHeaderTag)
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun lazyColumnShowsHeadersOnScroll() {
+        val items = (1..2).map { it.toString() }
+        val firstHeaderTag = "firstHeaderTag"
+        val secondHeaderTag = "secondHeaderTag"
+
+        rule.setContent {
+            LazyColumn(Modifier.preferredHeight(300.dp).testTag(LazyListTag)) {
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredHeight(101.dp).fillParentMaxWidth()
+                            .testTag(firstHeaderTag)
+                    )
+                }
+
+                items(items) {
+                    Spacer(Modifier.preferredHeight(101.dp).fillParentMaxWidth().testTag(it))
+                }
+
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredHeight(101.dp).fillParentMaxWidth()
+                            .testTag(secondHeaderTag)
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag(LazyListTag)
+            .scrollBy(y = 102.dp, density = rule.density)
+
+        rule.onNodeWithTag(firstHeaderTag)
+            .assertIsDisplayed()
+            .assertTopPositionInRootIsEqualTo(0.dp)
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag(secondHeaderTag)
+            .assertIsDisplayed()
+    }
+
+    @Test
+    fun lazyColumnHeaderIsReplaced() {
+        val items = (1..2).map { it.toString() }
+        val firstHeaderTag = "firstHeaderTag"
+        val secondHeaderTag = "secondHeaderTag"
+
+        rule.setContent {
+            LazyColumn(Modifier.preferredHeight(300.dp).testTag(LazyListTag)) {
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredHeight(101.dp).fillParentMaxWidth()
+                            .testTag(firstHeaderTag)
+                    )
+                }
+
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredHeight(101.dp).fillParentMaxWidth()
+                            .testTag(secondHeaderTag)
+                    )
+                }
+
+                items(items) {
+                    Spacer(Modifier.preferredHeight(101.dp).fillParentMaxWidth().testTag(it))
+                }
+            }
+        }
+
+        rule.onNodeWithTag(LazyListTag)
+            .scrollBy(y = 102.dp, density = rule.density)
+
+        rule.onNodeWithTag(firstHeaderTag)
+            .assertDoesNotExist()
+
+        rule.onNodeWithTag(secondHeaderTag)
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+    }
+
+    @Test
+    fun lazyRowShowsHeader() {
+        val items = (1..2).map { it.toString() }
+        val firstHeaderTag = "firstHeaderTag"
+        val secondHeaderTag = "secondHeaderTag"
+
+        rule.setContent {
+            LazyRow(Modifier.preferredWidth(300.dp)) {
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredWidth(101.dp).fillParentMaxHeight()
+                            .testTag(firstHeaderTag)
+                    )
+                }
+
+                items(items) {
+                    Spacer(Modifier.preferredWidth(101.dp).fillParentMaxHeight().testTag(it))
+                }
+
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredWidth(101.dp).fillParentMaxHeight()
+                            .testTag(secondHeaderTag)
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag(firstHeaderTag)
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag(secondHeaderTag)
+            .assertDoesNotExist()
+    }
+
+    @Test
+    fun lazyRowShowsHeadersOnScroll() {
+        val items = (1..2).map { it.toString() }
+        val firstHeaderTag = "firstHeaderTag"
+        val secondHeaderTag = "secondHeaderTag"
+
+        rule.setContent {
+            LazyRow(Modifier.preferredWidth(300.dp).testTag(LazyListTag)) {
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredWidth(101.dp).fillParentMaxHeight()
+                            .testTag(firstHeaderTag)
+                    )
+                }
+
+                items(items) {
+                    Spacer(Modifier.preferredWidth(101.dp).fillParentMaxHeight().testTag(it))
+                }
+
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredWidth(101.dp).fillParentMaxHeight()
+                            .testTag(secondHeaderTag)
+                    )
+                }
+            }
+        }
+
+        rule.onNodeWithTag(LazyListTag)
+            .scrollBy(x = 102.dp, density = rule.density)
+
+        rule.onNodeWithTag(firstHeaderTag)
+            .assertIsDisplayed()
+            .assertLeftPositionInRootIsEqualTo(0.dp)
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag(secondHeaderTag)
+            .assertIsDisplayed()
+    }
+
+    @Test
+    fun lazyRowHeaderIsReplaced() {
+        val items = (1..2).map { it.toString() }
+        val firstHeaderTag = "firstHeaderTag"
+        val secondHeaderTag = "secondHeaderTag"
+
+        rule.setContent {
+            LazyRow(Modifier.preferredWidth(300.dp).testTag(LazyListTag)) {
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredWidth(101.dp).fillParentMaxHeight()
+                            .testTag(firstHeaderTag)
+                    )
+                }
+
+                stickyHeader {
+                    Spacer(
+                        Modifier.preferredWidth(101.dp).fillParentMaxHeight()
+                            .testTag(secondHeaderTag)
+                    )
+                }
+
+                items(items) {
+                    Spacer(Modifier.preferredWidth(101.dp).fillParentMaxHeight().testTag(it))
+                }
+            }
+        }
+
+        rule.onNodeWithTag(LazyListTag)
+            .scrollBy(x = 102.dp, density = rule.density)
+
+        rule.onNodeWithTag(firstHeaderTag)
+            .assertDoesNotExist()
+
+        rule.onNodeWithTag(secondHeaderTag)
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("1")
+            .assertIsDisplayed()
+
+        rule.onNodeWithTag("2")
+            .assertIsDisplayed()
+    }
+
+    @Test
+    fun headerIsDisplayedWhenItIsFullyInContentPadding() {
+        val headerTag = "header"
+        val itemIndexPx = 100
+        val itemIndexDp = with(rule.density) { itemIndexPx.toDp() }
+        lateinit var state: LazyListState
+
+        rule.setContent {
+            LazyColumn(
+                Modifier.size(itemIndexDp * 4),
+                state = rememberLazyListState().also { state = it },
+                contentPadding = PaddingValues(top = itemIndexDp * 2)
+            ) {
+                stickyHeader {
+                    Spacer(Modifier.size(itemIndexDp).testTag(headerTag))
+                }
+
+                items((0..4).toList()) {
+                    Spacer(Modifier.size(itemIndexDp).testTag("$it"))
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            runBlocking { state.snapToItemIndex(1, itemIndexPx / 2) }
+        }
+
+        rule.onNodeWithTag(headerTag)
+            .assertTopPositionInRootIsEqualTo(itemIndexDp / 2)
+
+        rule.onNodeWithTag("0")
+            .assertTopPositionInRootIsEqualTo(itemIndexDp * 3 / 2)
+    }
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyScrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyScrollTest.kt
index 0af07dd..f720630 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyScrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyScrollTest.kt
@@ -24,12 +24,11 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.test.ExperimentalTesting
-import androidx.compose.ui.test.TestUiDispatcher
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withContext
 import org.junit.Before
@@ -37,13 +36,11 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
+import kotlin.math.roundToInt
 
 @MediumTest
-@OptIn(ExperimentalTesting::class)
 @RunWith(Parameterized::class)
 class LazyScrollTest(private val orientation: Orientation) {
-    private val LazyListTag = "LazyListTag"
-
     @get:Rule
     val rule = createComposeRule()
 
@@ -69,7 +66,7 @@
 
     @Test
     fun snapToItemTest() = runBlocking {
-        withContext(TestUiDispatcher.Main) {
+        withContext(Dispatchers.Main) {
             state.snapToItemIndex(3)
         }
         assertThat(state.firstVisibleItemIndex).isEqualTo(3)
@@ -79,14 +76,18 @@
     @ExperimentalFoundationApi
     @Test
     fun smoothScrollByTest() = runBlocking {
-        withContext(TestUiDispatcher.Main) {
-            state.smoothScrollBy(with(rule.density) { 320.dp.toPx() })
+        fun Int.dpToPx(): Int = with(rule.density) { dp.toPx().roundToInt() }
+        val scrollDistance = 320.dpToPx()
+        val itemSize = 101.dpToPx()
+
+        val expectedIndex = scrollDistance / itemSize // resolves to 3
+        val expectedOffset = scrollDistance % itemSize // resolves to ~17.dp.toIntPx()
+
+        withContext(Dispatchers.Main) {
+            state.smoothScrollBy(scrollDistance.toFloat())
         }
-        assertThat(state.firstVisibleItemIndex).isEqualTo(3)
-        assertThat(state.firstVisibleItemScrollOffset)
-            .isEqualTo(
-                with(rule.density) { 320.dp.toIntPx() - 101.dp.toIntPx() * 3 }
-            )
+        assertThat(state.firstVisibleItemIndex).isEqualTo(expectedIndex)
+        assertThat(state.firstVisibleItemScrollOffset).isEqualTo(expectedOffset)
     }
 
     @Composable
@@ -107,7 +108,7 @@
     }
 
     @Composable
-    private fun LazyItemScope.ItemContent() {
+    private fun ItemContent() {
         val modifier = if (vertical) {
             Modifier.preferredHeight(101.dp)
         } else {
@@ -121,4 +122,4 @@
         @Parameterized.Parameters(name = "{0}")
         fun params() = arrayOf(Orientation.Vertical, Orientation.Horizontal)
     }
-}
\ No newline at end of file
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
index b87870cf..fb9396c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
@@ -23,7 +23,7 @@
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.text.SoftwareKeyboardController
 import androidx.compose.ui.text.TextLayoutResult
 import androidx.compose.ui.text.TextStyle
@@ -119,7 +119,7 @@
     onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
     cursorColor: Color = AmbientContentColor.current
 ) {
-    val color = textColor.useOrElse { textStyle.color.useOrElse { AmbientContentColor.current } }
+    val color = textColor.takeOrElse { textStyle.color.takeOrElse { AmbientContentColor.current } }
     val mergedStyle = textStyle.merge(TextStyle(color = color))
 
     BasicTextField(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Text.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Text.kt
index 0051606..0f13853 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Text.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Text.kt
@@ -28,7 +28,7 @@
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.Paragraph
 import androidx.compose.ui.text.TextLayoutResult
@@ -217,7 +217,7 @@
     onTextLayout: (TextLayoutResult) -> Unit = {},
     style: TextStyle = AmbientTextStyle.current
 ) {
-    val textColor = color.useOrElse { style.color.useOrElse { AmbientContentColor.current } }
+    val textColor = color.takeOrElse { style.color.takeOrElse { AmbientContentColor.current } }
     val mergedStyle = style.merge(
         TextStyle(
             color = textColor,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
index 7535b73..bc5160d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyDsl.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.lazy
 
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.InternalLayoutApi
 import androidx.compose.foundation.layout.PaddingValues
@@ -56,12 +57,24 @@
         items: List<T>,
         itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
     )
+
+    /**
+     * Adds a sticky header item, which will remain pinned even when scrolling after it.
+     * The header will remain pinned until the next header will take its place.
+     *
+     * @sample androidx.compose.foundation.samples.StickyHeaderSample
+     *
+     * @param content the content of the header
+     */
+    @ExperimentalFoundationApi
+    fun stickyHeader(content: @Composable LazyItemScope.() -> Unit)
 }
 
 internal class LazyListScopeImpl : LazyListScope {
     private val intervals = IntervalList<LazyItemScope.(Int) -> (@Composable () -> Unit)>()
-
     val totalSize get() = intervals.totalSize
+    var headersIndexes: MutableList<Int>? = null
+        private set
 
     fun contentFor(index: Int, scope: LazyItemScope): @Composable () -> Unit {
         val interval = intervals.intervalForIndex(index)
@@ -93,6 +106,16 @@
             @Composable { itemContent(index, item) }
         }
     }
+
+    @ExperimentalFoundationApi
+    override fun stickyHeader(content: @Composable LazyItemScope.() -> Unit) {
+        val headersIndexes = headersIndexes ?: mutableListOf<Int>().also {
+            headersIndexes = it
+        }
+        headersIndexes.add(totalSize)
+
+        item(content)
+    }
 }
 
 /**
@@ -142,7 +165,8 @@
         verticalAlignment = verticalAlignment,
         horizontalArrangement = horizontalArrangement,
         isVertical = false,
-        reverseLayout = reverseLayout
+        reverseLayout = reverseLayout,
+        headerIndexes = scope.headersIndexes ?: emptyList()
     ) { index ->
         scope.contentFor(index, this)
     }
@@ -195,7 +219,8 @@
         horizontalAlignment = horizontalAlignment,
         verticalArrangement = verticalArrangement,
         isVertical = true,
-        reverseLayout = reverseLayout
+        reverseLayout = reverseLayout,
+        headerIndexes = scope.headersIndexes ?: emptyList()
     ) { index ->
         scope.contentFor(index, this)
     }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index 69971f10..5f110cb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -57,6 +57,8 @@
     verticalAlignment: Alignment.Vertical? = null,
     /** The horizontal arrangement for items. Required when isVertical is false */
     horizontalArrangement: Arrangement.Horizontal? = null,
+    /** The list of indexes of the sticky header items */
+    headerIndexes: List<Int> = emptyList(),
     /** The factory defining the content for an item on the given position in the list */
     itemContent: LazyItemScope.(Int) -> @Composable () -> Unit
 ) {
@@ -132,13 +134,20 @@
 
         state.applyMeasureResult(measureResult)
 
+        val headers = if (headerIndexes.isNotEmpty()) {
+            LazyListHeaders(itemProvider, headerIndexes, measureResult, startContentPaddingPx)
+        } else {
+            null
+        }
+
         layoutLazyList(
             constraints,
             isVertical,
             verticalArrangement,
             horizontalArrangement,
             measureResult,
-            reverseLayout
+            reverseLayout,
+            headers
         )
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
new file mode 100644
index 0000000..2c4b295
--- /dev/null
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListHeaders.kt
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.foundation.lazy
+
+import androidx.compose.ui.layout.Placeable
+
+/**
+ * @param itemProvider the provider so we can compose a header if it wasn't composed already
+ * @param headerIndexes list of indexes of headers. Must be sorted.
+ * @param measureResult the result of the measuring.
+ */
+internal class LazyListHeaders(
+    private val itemProvider: LazyMeasuredItemProvider,
+    headerIndexes: List<Int>,
+    measureResult: LazyListMeasureResult,
+    private val startContentPadding: Int
+) {
+    private val currentHeaderListPosition: Int
+    private val nextHeaderListPosition: Int
+
+    private val notUsedButComposedItems: MutableList<LazyMeasuredItem>?
+
+    private var currentHeaderItem: LazyMeasuredItem? = null
+    private var currentHeaderOffset: Int = Int.MIN_VALUE
+    private var nextHeaderOffset: Int = Int.MIN_VALUE
+    private var nextHeaderSize: Int = Int.MIN_VALUE
+
+    init {
+        var currentHeaderListPosition = -1
+        var nextHeaderListPosition = -1
+        // we use visibleItemsInfo and not firstVisibleItemIndex as visibleItemsInfo list also
+        // contains all the items which are visible in the start content padding area
+        val firstVisible = measureResult.visibleItemsInfo.first().index
+        // find the header which can be displayed
+        for (index in headerIndexes.indices) {
+            if (headerIndexes[index] <= firstVisible) {
+                currentHeaderListPosition = headerIndexes[index]
+                nextHeaderListPosition = headerIndexes.getOrElse(index + 1) { -1 }
+            } else {
+                break
+            }
+        }
+        this.currentHeaderListPosition = currentHeaderListPosition
+        this.nextHeaderListPosition = nextHeaderListPosition
+
+        notUsedButComposedItems = measureResult.notUsedButComposedItems
+    }
+
+    fun onBeforeItemsPlacing() {
+        currentHeaderItem = null
+        currentHeaderOffset = Int.MIN_VALUE
+        nextHeaderOffset = Int.MIN_VALUE
+    }
+
+    fun place(
+        item: LazyMeasuredItem,
+        scope: Placeable.PlacementScope,
+        layoutWidth: Int,
+        layoutHeight: Int,
+        offset: Int,
+        reverseOrder: Boolean
+    ) {
+        if (item.index == currentHeaderListPosition) {
+            currentHeaderItem = item
+            currentHeaderOffset = offset
+        } else {
+            item.place(scope, layoutWidth, layoutHeight, offset, reverseOrder)
+            if (item.index == nextHeaderListPosition) {
+                nextHeaderOffset = offset
+                nextHeaderSize = item.size
+            }
+        }
+    }
+
+    fun onAfterItemsPlacing(
+        scope: Placeable.PlacementScope,
+        mainAxisLayoutSize: Int,
+        layoutWidth: Int,
+        layoutHeight: Int,
+        reverseOrder: Boolean
+    ) {
+        if (currentHeaderListPosition == -1) {
+            // we have no headers needing special handling
+            return
+        }
+
+        val headerItem = currentHeaderItem
+            ?: notUsedButComposedItems?.find { it.index == currentHeaderListPosition }
+            ?: itemProvider.getAndMeasure(DataIndex(currentHeaderListPosition))
+
+        var headerOffset = if (!reverseOrder) {
+            if (currentHeaderOffset != Int.MIN_VALUE) {
+                maxOf(-startContentPadding, currentHeaderOffset)
+            } else {
+                -startContentPadding
+            }
+        } else {
+            if (currentHeaderOffset != Int.MIN_VALUE) {
+                minOf(
+                    mainAxisLayoutSize + startContentPadding - headerItem.size,
+                    currentHeaderOffset
+                )
+            } else {
+                mainAxisLayoutSize + startContentPadding - headerItem.size
+            }
+        }
+        // if we have a next header overlapping with the current header, the next one will be
+        // pushing the current one away from the viewport.
+        if (nextHeaderOffset != Int.MIN_VALUE) {
+            if (!reverseOrder) {
+                headerOffset = minOf(headerOffset, nextHeaderOffset - headerItem.size)
+            } else {
+                headerOffset = maxOf(headerOffset, nextHeaderOffset + headerItem.size)
+            }
+        }
+
+        headerItem.place(scope, layoutWidth, layoutHeight, headerOffset, reverseOrder)
+    }
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
index 3e4670e..984380a 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
@@ -55,6 +55,7 @@
             firstVisibleItemScrollOffset = 0,
             canScrollForward = false,
             consumedScroll = 0f,
+            notUsedButComposedItems = null,
             viewportStartOffset = -startContentPadding,
             viewportEndOffset = endContentPadding,
             totalItemsCount = 0
@@ -223,6 +224,7 @@
             firstVisibleItemScrollOffset = currentFirstItemScrollOffset,
             canScrollForward = mainAxisUsed > maxOffset,
             consumedScroll = consumedScroll,
+            notUsedButComposedItems = notUsedButComposedItems,
             viewportStartOffset = -startContentPadding,
             viewportEndOffset = maximumVisibleOffset,
             totalItemsCount = itemsCount
@@ -240,7 +242,8 @@
     verticalArrangement: Arrangement.Vertical?,
     horizontalArrangement: Arrangement.Horizontal?,
     measureResult: LazyListMeasureResult,
-    reverseLayout: Boolean
+    reverseLayout: Boolean,
+    headers: LazyListHeaders?
 ): MeasureResult {
     val layoutWidth = constraints.constrainWidth(
         if (isVertical) measureResult.crossAxisSize else measureResult.mainAxisSize
@@ -274,15 +277,23 @@
                 items[index].place(this, layoutWidth, layoutHeight, position, reverseLayout)
             }
         } else {
+            headers?.onBeforeItemsPlacing()
             measureResult.items.fastForEach {
                 val offset = if (reverseLayout) {
                     mainAxisLayoutSize - currentMainAxis - (it.size)
                 } else {
                     currentMainAxis
                 }
-                it.place(this, layoutWidth, layoutHeight, offset, reverseLayout)
+                if (headers != null) {
+                    headers.place(it, this, layoutWidth, layoutHeight, offset, reverseLayout)
+                } else {
+                    it.place(this, layoutWidth, layoutHeight, offset, reverseLayout)
+                }
                 currentMainAxis += it.sizeWithSpacings
             }
+            headers?.onAfterItemsPlacing(
+                this, mainAxisLayoutSize, layoutWidth, layoutHeight, reverseLayout
+            )
         }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
index 02b13b3..fb89915 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasureResult.kt
@@ -36,6 +36,8 @@
     val canScrollForward: Boolean,
     /** The amount of scroll consumed during the measure pass.*/
     val consumedScroll: Float,
+    /** The composed MeasuredItem which we are not going to place as they are out of screen.*/
+    val notUsedButComposedItems: MutableList<LazyMeasuredItem>?,
     override val viewportStartOffset: Int,
     override val viewportEndOffset: Int,
     override val totalItemsCount: Int
diff --git a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
index 1daba13..5b0c252 100644
--- a/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
+++ b/compose/material/material-ripple/src/commonMain/kotlin/androidx/compose/material/ripple/Ripple.kt
@@ -39,7 +39,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.drawscope.DrawScope
 import androidx.compose.ui.graphics.drawscope.clipRect
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.platform.AmbientAnimationClock
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.util.fastForEach
@@ -89,7 +89,7 @@
 ): Indication {
     val theme = AmbientRippleTheme.current
     val clock = AmbientAnimationClock.current.asDisposableClock()
-    val resolvedColor = color.useOrElse { theme.defaultColor() }
+    val resolvedColor = color.takeOrElse { theme.defaultColor() }
     val colorState = remember { mutableStateOf(resolvedColor, structuralEqualityPolicy()) }
     colorState.value = resolvedColor
     val rippleAlpha = theme.rippleAlpha()
@@ -136,7 +136,7 @@
 ): Indication {
     val theme = AmbientRippleTheme.current
     val clock = AmbientAnimationClock.current.asDisposableClock()
-    val resolvedColor = color.useOrElse { theme.defaultColor() }
+    val resolvedColor = color.takeOrElse { theme.defaultColor() }
     val colorState = remember { mutableStateOf(resolvedColor, structuralEqualityPolicy()) }
     colorState.value = resolvedColor
     val rippleAlpha = theme.rippleAlpha()
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
index 452942f..faa4f03 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
@@ -47,7 +47,6 @@
 import androidx.compose.ui.layout.onGloballyPositioned
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.test.assertHasClickAction
-import androidx.compose.ui.test.assertHasNoClickAction
 import androidx.compose.ui.test.assertHeightIsAtLeast
 import androidx.compose.ui.test.assertHeightIsEqualTo
 import androidx.compose.ui.test.assertIsEnabled
@@ -63,7 +62,6 @@
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.LargeTest
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
@@ -133,7 +131,6 @@
     }
 
     @Test
-    @FlakyTest // TODO: b/158341686
     fun canBeDisabled() {
         val tag = "myButton"
 
@@ -151,8 +148,8 @@
             .assertHasClickAction()
             .assertIsEnabled()
             .performClick()
-            // Then confirm it's disabled with no click action after clicking it
-            .assertHasNoClickAction()
+            // Then confirm it's disabled with click action after clicking it
+            .assertHasClickAction()
             .assertIsNotEnabled()
     }
 
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
index 493497b..2881b3c 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Colors.kt
@@ -24,7 +24,7 @@
 import androidx.compose.runtime.staticAmbientOf
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 
 /**
  * Collection of colors in the
@@ -260,7 +260,7 @@
  */
 @Composable
 fun contentColorFor(color: Color) =
-    MaterialTheme.colors.contentColorFor(color).useOrElse { AmbientContentColor.current }
+    MaterialTheme.colors.contentColorFor(color).takeOrElse { AmbientContentColor.current }
 
 /**
  * Updates the internal values of the given [Colors] with values from the [other] [Colors]. This
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
index 4cd516e..0f032e0 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/MaterialTextSelectionColors.kt
@@ -21,7 +21,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.compositeOver
 import androidx.compose.ui.graphics.luminance
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.selection.TextSelectionColors
 import androidx.compose.ui.util.annotation.VisibleForTesting
 import kotlin.math.max
@@ -41,7 +41,7 @@
     // 'worst case' scenario. We explicitly don't test with ContentAlpha.disabled, as disabled
     // text shouldn't be selectable / is noted as disabled for accessibility purposes.
     val textColorWithLowestAlpha = colors.contentColorFor(backgroundColor)
-        .useOrElse {
+        .takeOrElse {
             AmbientContentColor.current
         }.copy(
             alpha = ContentAlpha.medium
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
index d96a672..d0b7854 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
@@ -24,7 +24,7 @@
 import androidx.compose.runtime.structuralEqualityPolicy
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.text.AnnotatedString
 import androidx.compose.ui.text.Paragraph
 import androidx.compose.ui.text.TextLayoutResult
@@ -193,8 +193,8 @@
     onTextLayout: (TextLayoutResult) -> Unit = {},
     style: TextStyle = AmbientTextStyle.current
 ) {
-    val textColor = color.useOrElse {
-        style.color.useOrElse {
+    val textColor = color.takeOrElse {
+        style.color.takeOrElse {
             AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
         }
     }
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
index df1666e..f378300 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
@@ -43,7 +43,7 @@
 import androidx.compose.ui.focus.focusReference
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.layout.LayoutModifier
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasureResult
@@ -98,7 +98,7 @@
     shape: Shape
 ) {
     // If color is not provided via the text style, use content color as a default
-    val textColor = textStyle.color.useOrElse {
+    val textColor = textStyle.color.takeOrElse {
         AmbientContentColor.current.copy(alpha = AmbientContentAlpha.current)
     }
     val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index 467d785..546503d 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -315,11 +315,13 @@
   public final class Recomposer extends androidx.compose.runtime.CompositionReference {
     ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
     method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public int getChangeCount();
     method public boolean hasInvalidations();
     method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @Deprecated public suspend Object? recomposeAndApplyChanges(long frameCount, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<?> p);
     method public void shutDown();
+    property public final int changeCount;
     field public static final androidx.compose.runtime.Recomposer.Companion Companion;
   }
 
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index 467d785..546503d 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -315,11 +315,13 @@
   public final class Recomposer extends androidx.compose.runtime.CompositionReference {
     ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
     method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public int getChangeCount();
     method public boolean hasInvalidations();
     method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @Deprecated public suspend Object? recomposeAndApplyChanges(long frameCount, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<?> p);
     method public void shutDown();
+    property public final int changeCount;
     field public static final androidx.compose.runtime.Recomposer.Companion Companion;
   }
 
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index 6b187d6..623a343 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -347,11 +347,13 @@
   public final class Recomposer extends androidx.compose.runtime.CompositionReference {
     ctor public Recomposer(kotlin.coroutines.CoroutineContext effectCoroutineContext);
     method public suspend Object? awaitIdle(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+    method public int getChangeCount();
     method public boolean hasInvalidations();
     method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method @Deprecated public suspend Object? recomposeAndApplyChanges(long frameCount, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
     method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<?> p);
     method public void shutDown();
+    property public final int changeCount;
     field public static final androidx.compose.runtime.Recomposer.Companion Companion;
   }
 
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
index f6d3736..0a39f35 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Composer.kt
@@ -2100,7 +2100,7 @@
                     if (!complete) abortRoot()
                 }
             }
-            return true
+            return changes.isNotEmpty()
         }
         return false
     }
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
index 3a8f142..c91281c 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
@@ -77,6 +77,13 @@
 class Recomposer(
     effectCoroutineContext: CoroutineContext
 ) : CompositionReference() {
+    /**
+     * This is a running count of the number of times the recomposer awoke and applied changes to
+     * one or more composers. This count is unaffected if the composer awakes and recomposed but
+     * composition did not produce changes to apply.
+     */
+    var changeCount = 0
+        private set
 
     /**
      * This collection is its own lock, shared with [invalidComposersAwaiter]
@@ -306,10 +313,12 @@
 
                             // Actually perform recomposition for any invalidated composers
                             if (toRecompose.isNotEmpty()) {
+                                var changes = false
                                 for (i in 0 until toRecompose.size) {
-                                    performRecompose(toRecompose[i])
+                                    changes = performRecompose(toRecompose[i]) || changes
                                 }
                                 toRecompose.clear()
+                                if (changes) changeCount++
                             }
                         }
                     }
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
index f0679f2..095ec84 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/CompositionTests.kt
@@ -17,45 +17,41 @@
 @file:OptIn(ExperimentalComposeApi::class, InternalComposeApi::class)
 package androidx.compose.runtime
 
-import androidx.compose.runtime.dispatch.MonotonicFrameClock
 import androidx.compose.runtime.mock.Contact
 import androidx.compose.runtime.mock.ContactModel
-import androidx.compose.runtime.mock.MockComposeScope
-import androidx.compose.runtime.mock.MockViewListValidator
 import androidx.compose.runtime.mock.MockViewValidator
 import androidx.compose.runtime.mock.Point
 import androidx.compose.runtime.mock.Report
 import androidx.compose.runtime.mock.TestMonotonicFrameClock
-import androidx.compose.runtime.mock.View
 import androidx.compose.runtime.mock.ViewApplier
 import androidx.compose.runtime.mock.contact
-import androidx.compose.runtime.mock.edit
-import androidx.compose.runtime.mock.linear
-import androidx.compose.runtime.mock.memoize
-import androidx.compose.runtime.mock.points
-import androidx.compose.runtime.mock.repeat
-import androidx.compose.runtime.mock.reportsReport
-import androidx.compose.runtime.mock.reportsTo
-import androidx.compose.runtime.mock.selectContact
+import androidx.compose.runtime.mock.Edit
+import androidx.compose.runtime.mock.Linear
+import androidx.compose.runtime.mock.Points
+import androidx.compose.runtime.mock.Repeated
+import androidx.compose.runtime.mock.ReportsReport
+import androidx.compose.runtime.mock.ReportsTo
+import androidx.compose.runtime.mock.SelectContact
+import androidx.compose.runtime.mock.compositionTest
 import androidx.compose.runtime.mock.skip
-import androidx.compose.runtime.mock.text
+import androidx.compose.runtime.mock.Text
+import androidx.compose.runtime.mock.expectChanges
+import androidx.compose.runtime.mock.expectNoChanges
+import androidx.compose.runtime.mock.validate
 import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.snapshots.takeMutableSnapshot
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.Job
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.test.runBlockingTest
 import kotlin.test.AfterTest
 import kotlin.test.Test
 import kotlin.test.assertEquals
-import kotlin.test.assertFalse
 import kotlin.test.assertNotEquals
 import kotlin.test.assertTrue
 
-@Composable fun Container(content: @Composable () -> Unit) = content()
+@Composable
+fun Container(content: @Composable () -> Unit) = content()
 
 @Stable
 @OptIn(ExperimentalComposeApi::class, InternalComposeApi::class)
@@ -68,21 +64,21 @@
     }
 
     @Test
-    fun testComposeAModel() {
+    fun testComposeAModel() = compositionTest {
         val model = testModel()
-        val result = compose {
-            selectContact(model)
+        compose {
+            SelectContact(model)
         }
 
-        result.validate {
-            linear {
-                linear {
-                    text("Filter:")
-                    edit("")
+        validate {
+            Linear {
+                Linear {
+                    Text("Filter:")
+                    Edit("")
                 }
-                linear {
-                    text(value = "Contacts:")
-                    linear {
+                Linear {
+                    Text(value = "Contacts:")
+                    Linear {
                         contact(bob)
                         contact(jon)
                         contact(steve)
@@ -93,35 +89,36 @@
     }
 
     @Test
-    fun testRecomposeWithoutChanges() {
+    fun testRecomposeWithoutChanges() = compositionTest {
         val model = testModel()
-        val result = compose {
-            selectContact(model)
+        compose {
+            SelectContact(model)
         }
 
-        result.expectNoChanges()
+        expectNoChanges()
 
-        result.validate {
-            selectContact(model)
+        validate {
+            SelectContact(model)
         }
     }
 
     @Test
-    fun testInsertAContact() {
+    fun testInsertAContact() = compositionTest {
         val model =
             testModel(mutableListOf(bob, jon))
         var changed = {}
-        val result = compose {
+
+        compose {
             changed = invalidate
-            selectContact(model)
+            SelectContact(model)
         }
 
-        result.validate {
-            linear {
+        validate {
+            Linear {
                 skip()
-                linear {
+                Linear {
                     skip()
-                    linear {
+                    Linear {
                         contact(bob)
                         contact(jon)
                     }
@@ -131,14 +128,14 @@
 
         model.add(steve, after = bob)
         changed()
-        result.expectChanges()
+        expectChanges()
 
-        result.validate {
-            linear {
+        validate {
+            Linear {
                 skip()
-                linear {
+                Linear {
                     skip()
-                    linear {
+                    Linear {
                         contact(bob)
                         contact(steve)
                         contact(jon)
@@ -149,7 +146,7 @@
     }
 
     @Test
-    fun testMoveAContact() {
+    fun testMoveAContact() = compositionTest {
         val model = testModel(
             mutableListOf(
                 bob,
@@ -158,21 +155,22 @@
             )
         )
         var changed = {}
-        val result = compose {
+
+        compose {
             changed = invalidate
-            selectContact(model)
+            SelectContact(model)
         }
 
         model.move(steve, after = jon)
         changed()
-        result.expectChanges()
+        expectChanges()
 
-        result.validate {
-            linear {
+        validate {
+            Linear {
                 skip()
-                linear {
+                Linear {
                     skip()
-                    linear {
+                    Linear {
                         contact(bob)
                         contact(jon)
                         contact(steve)
@@ -183,7 +181,7 @@
     }
 
     @Test
-    fun testChangeTheFilter() {
+    fun testChangeTheFilter() = compositionTest {
         val model = testModel(
             mutableListOf(
                 bob,
@@ -191,22 +189,23 @@
                 jon
             )
         )
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = {}
+
+        compose {
             changed = invalidate
-            selectContact(model)
+            SelectContact(model)
         }
 
         model.filter = "Jon"
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate {
-            linear {
+        validate {
+            Linear {
                 skip()
-                linear {
+                Linear {
                     skip()
-                    linear {
+                    Linear {
                         contact(jon)
                     }
                 }
@@ -215,33 +214,33 @@
     }
 
     @Test
-    fun testComposeCompositionWithMultipleRoots() {
+    fun testComposeCompositionWithMultipleRoots() = compositionTest {
         val reports = listOf(
             jim_reports_to_sally,
             rob_reports_to_alice,
             clark_reports_to_lois
         )
 
-        val result = compose {
-            reportsReport(reports)
+        compose {
+            ReportsReport(reports)
         }
 
-        result.validate {
-            reportsReport(reports)
+        validate {
+            ReportsReport(reports)
         }
     }
 
     @Test
-    fun testMoveCompositionWithMultipleRoots() {
+    fun testMoveCompositionWithMultipleRoots() = compositionTest {
         var reports = listOf(
             jim_reports_to_sally,
             rob_reports_to_alice,
             clark_reports_to_lois
         )
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            reportsReport(reports)
+            ReportsReport(reports)
         }
 
         reports = listOf(
@@ -249,100 +248,110 @@
             clark_reports_to_lois,
             rob_reports_to_alice
         )
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate {
-            reportsReport(reports)
+        validate {
+            ReportsReport(reports)
         }
     }
 
     @Test
-    fun testReplace() {
+    fun testReplace() = compositionTest {
         var includeA = true
-        var changed: (() -> Unit)? = null
-        @Composable fun MockComposeScope.composition() {
+        var changed = { }
+
+        @Composable
+        fun Composition() {
             changed = invalidate
-            text("Before")
+            Text("Before")
             if (includeA) {
-                linear {
-                    text("A")
+                Linear {
+                    Text("A")
                 }
             } else {
-                edit("B")
+                Edit("B")
             }
-            text("After")
+            Text("After")
         }
-        fun MockViewValidator.composition() {
-            text("Before")
+
+        fun MockViewValidator.Composition() {
+            Text("Before")
             if (includeA) {
-                linear {
-                    text("A")
+                Linear {
+                    Text("A")
                 }
             } else {
-                edit("B")
+                Edit("B")
             }
-            text("After")
+            Text("After")
         }
-        val result = compose {
-            composition()
+
+        compose {
+            Composition()
         }
-        result.validate {
-            composition()
+
+        validate {
+            this.Composition()
         }
+
         includeA = false
-        changed!!()
-        result.expectChanges()
-        result.validate {
-            composition()
+        changed()
+        expectChanges()
+        validate {
+            this.Composition()
         }
         includeA = true
-        changed!!()
-        result.expectChanges()
-        result.validate {
-            composition()
+        changed()
+        expectChanges()
+        validate {
+            this.Composition()
         }
+        changed()
+        expectNoChanges()
     }
 
     @Test
-    fun testInsertWithMultipleRoots() {
+    fun testInsertWithMultipleRoots() = compositionTest {
         var chars = listOf('a', 'b', 'c')
-        var changed: (() -> Unit)? = null
+        var changed = { }
 
-        @Composable fun MockComposeScope.textOf(c: Char) {
-            text(c.toString())
+        @Composable
+        fun TextOf(c: Char) {
+            Text(c.toString())
         }
 
-        fun MockViewValidator.textOf(c: Char) {
-            text(c.toString())
+        fun MockViewValidator.TextOf(c: Char) {
+            Text(c.toString())
         }
 
-        @Composable fun MockComposeScope.chars(chars: Iterable<Char>) {
-            repeat(of = chars) { c -> textOf(c) }
+        @Composable
+        fun Chars(chars: Iterable<Char>) {
+            Repeated(of = chars) { c -> TextOf(c) }
         }
 
         fun MockViewValidator.validateChars(chars: Iterable<Char>) {
-            repeat(of = chars) { c -> textOf(c) }
+            Repeated(of = chars) { c -> this.TextOf(c) }
         }
 
-        val result = compose {
+        compose {
             changed = invalidate
-            chars(chars)
-            chars(chars)
-            chars(chars)
+            Chars(chars)
+            Chars(chars)
+            Chars(chars)
         }
 
-        result.validate {
+        validate {
             validateChars(chars)
             validateChars(chars)
             validateChars(chars)
         }
 
         chars = listOf('a', 'b', 'x', 'c')
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate {
+        validate {
             validateChars(chars)
             validateChars(chars)
             validateChars(chars)
@@ -350,33 +359,35 @@
     }
 
     @Test
-    fun testSimpleMemoize() {
+    fun testSimpleSkipping() = compositionTest {
         val points = listOf(Point(1, 2), Point(2, 3))
-        val result = compose {
-            points(points)
+        var changed = {}
+        compose {
+            changed = invalidate
+            Points(points)
         }
 
-        result.validate { points(points) }
+        validate { Points(points) }
 
-        val changes = result.recompose()
-        assertFalse(changes)
+        changed()
+        expectNoChanges()
     }
 
     @Test
-    fun testMovingMemoization() {
+    fun testMovingMemoization() = compositionTest {
         var points = listOf(
             Point(1, 2),
             Point(2, 3),
             Point(4, 5),
             Point(6, 7)
         )
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            points(points)
+            Points(points)
         }
 
-        result.validate { points(points) }
+        validate { Points(points) }
 
         points = listOf(
             Point(1, 2),
@@ -384,27 +395,29 @@
             Point(2, 3),
             Point(6, 7)
         )
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate { points(points) }
+        validate { Points(points) }
     }
 
     @Test
-    fun testComponent() {
-        @Composable fun MockComposeScope.Reporter(report: Report? = null) {
+    fun testComponent() = compositionTest {
+        @Composable
+        fun Reporter(report: Report? = null) {
             if (report != null) {
-                text(report.from)
-                text("reports to")
-                text(report.to)
+                Text(report.from)
+                Text("reports to")
+                Text(report.to)
             } else {
-                text("no report to report")
+                Text("no report to report")
             }
         }
 
-        @Composable fun MockComposeScope.reportsReport(reports: Iterable<Report>) {
-            linear {
-                repeat(of = reports) { report ->
+        @Composable
+        fun ReportsReport(reports: Iterable<Report>) {
+            Linear {
+                Repeated(of = reports) { report ->
                     Reporter(report)
                 }
             }
@@ -415,246 +428,260 @@
             rob_reports_to_alice,
             clark_reports_to_lois
         )
-        val result = compose {
-            reportsReport(reports)
+        compose {
+            ReportsReport(reports)
         }
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
-                reportsTo(clark_reports_to_lois)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
+                ReportsTo(clark_reports_to_lois)
             }
         }
 
-        result.expectNoChanges()
+        expectNoChanges()
     }
 
     @Test
-    fun testComposeTwoAttributeComponent() {
-        @Composable fun MockComposeScope.Two2(first: Int = 1, second: Int = 2) {
-            linear {
-                text("$first $second")
+    fun testComposeTwoAttributeComponent() = compositionTest {
+        @Composable
+        fun Two2(first: Int = 1, second: Int = 2) {
+            Linear {
+                Text("$first $second")
             }
         }
 
         fun MockViewValidator.two(first: Int, second: Int) {
-            linear {
-                text("$first $second")
+            Linear {
+                Text("$first $second")
             }
         }
 
-        val result = compose {
+        compose {
             Two2(41, 42)
         }
 
-        result.validate {
+        validate {
             two(41, 42)
         }
     }
 
     @Test
-    fun testComposeThreeAttributeComponent() {
-        @Composable fun MockComposeScope.Three3(first: Int = 1, second: Int = 2, third: Int = 3) {
-            linear {
-                text("$first $second $third")
+    fun testComposeThreeAttributeComponent() = compositionTest {
+        @Composable
+        fun Three3(first: Int = 1, second: Int = 2, third: Int = 3) {
+            Linear {
+                Text("$first $second $third")
             }
         }
 
-        fun MockViewValidator.three(first: Int, second: Int, third: Int) {
-            linear {
-                text("$first $second $third")
+        fun MockViewValidator.Three(first: Int, second: Int, third: Int) {
+            Linear {
+                Text("$first $second $third")
             }
         }
 
-        val result = compose {
+        compose {
             Three3(41, 42, 43)
         }
 
-        result.validate {
-            three(41, 42, 43)
+        validate {
+            Three(41, 42, 43)
         }
     }
 
     @Test
-    fun testComposeFourOrMoreAttributeComponent() {
-        @Composable fun MockComposeScope.Four4(
+    fun testComposeFourOrMoreAttributeComponent() = compositionTest {
+        @Composable
+        fun Four4(
             first: Int = 1,
             second: Int = 2,
             third: Int = 3,
             fourth: Int = 4
         ) {
-            linear {
-                text("$first $second $third $fourth")
+            Linear {
+                Text("$first $second $third $fourth")
             }
         }
 
-        fun MockViewValidator.four(first: Int, second: Int, third: Int, fourth: Int) {
-            linear {
-                text("$first $second $third $fourth")
+        fun MockViewValidator.Four(first: Int, second: Int, third: Int, fourth: Int) {
+            Linear {
+                Text("$first $second $third $fourth")
             }
         }
 
-        val result = compose {
+        compose {
             Four4(41, 42, 43, 44)
         }
 
-        result.validate {
-            four(41, 42, 43, 44)
+        validate {
+            Four(41, 42, 43, 44)
         }
     }
 
     @Test
-    fun testSkippingACall() {
+    fun testSkippingACall() = compositionTest {
 
-        @Composable fun MockComposeScope.show(value: Int) {
-            linear {
-                text("$value")
+        @Composable
+        fun Show(value: Int) {
+            Linear {
+                Text("$value")
             }
-            linear {
-                text("value")
+            Linear {
+                Text("value")
             }
         }
 
-        fun MockViewValidator.show(value: Int) {
-            linear {
-                text("$value")
+        fun MockViewValidator.Show(value: Int) {
+            Linear {
+                Text("$value")
             }
-            linear {
-                text("value")
+            Linear {
+                Text("value")
             }
         }
 
-        @Composable fun MockComposeScope.test(showThree: Boolean) {
-            show(1)
-            show(2)
+        @Composable
+        fun Test(showThree: Boolean) {
+            Show(1)
+            Show(2)
             if (showThree) {
-                show(3)
+                Show(3)
             }
         }
 
         var showThree = false
 
-        var recomposeTest: () -> Unit = { }
+        var changed = { }
 
-        @Composable fun MockComposeScope.Test() {
-            recomposeTest = invalidate
-            test(showThree)
+        @Composable
+        fun Test() {
+            changed = invalidate
+            Test(showThree)
         }
 
-        fun MockViewValidator.test(showThree: Boolean) {
-            show(1)
-            show(2)
+        fun MockViewValidator.Test(showThree: Boolean) {
+            this.Show(1)
+            this.Show(2)
             if (showThree) {
-                show(3)
+                this.Show(3)
             }
         }
 
-        val composition: @Composable MockComposeScope.() -> Unit = {
+        fun validate() {
+            validate {
+                this.Test(showThree)
+            }
+        }
+
+        compose {
             Test()
         }
-        val validation: MockViewValidator.() -> Unit = {
-            test(showThree)
-        }
 
-        val result = compose(block = composition)
-        result.validate(validation)
+        validate()
 
         showThree = true
-        recomposeTest()
-        result.expectChanges()
-        result.validate(validation)
+        changed()
+        expectChanges()
+        validate()
     }
 
     @Test
-    fun testComponentWithVarConstructorParameter() {
-        @Composable fun MockComposeScope.One(first: Int) {
-            text("$first")
+    fun testComponentWithVarConstructorParameter() = compositionTest {
+        @Composable
+        fun One(first: Int) {
+            Text("$first")
         }
 
-        fun MockViewValidator.one(first: Int) {
-            text("$first")
+        fun MockViewValidator.One(first: Int) {
+            Text("$first")
         }
 
-        @Composable fun MockComposeScope.callOne(value: Int) {
+        @Composable
+        fun CallOne(value: Int) {
             One(first = value)
         }
 
         var value = 42
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            callOne(value)
+            CallOne(value)
         }
 
-        result.validate {
-            one(42)
+        validate {
+            this.One(42)
         }
 
         value = 43
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate {
-            one(43)
+        validate {
+            this.One(43)
         }
     }
 
     @Test
-    fun testComponentWithValConstructorParameter() {
-        @Composable fun MockComposeScope.One(first: Int) {
-            text("$first")
+    fun testComponentWithValConstructorParameter() = compositionTest {
+        @Composable
+        fun One(first: Int) {
+            Text("$first")
         }
 
-        fun MockViewValidator.one(first: Int) {
-            text("$first")
+        fun MockViewValidator.One(first: Int) {
+            Text("$first")
         }
 
-        @Composable fun MockComposeScope.callOne(value: Int) {
+        @Composable
+        fun CallOne(value: Int) {
             One(first = value)
         }
 
         var value = 42
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            callOne(value)
+            CallOne(value)
         }
 
-        result.validate {
-            one(42)
+        validate {
+            this.One(42)
         }
 
         value = 43
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate {
-            one(43)
+        validate {
+            this.One(43)
         }
 
-        changed!!()
-        result.expectNoChanges()
+        changed()
+        expectNoChanges()
     }
 
     @Test
-    fun testComposePartOfTree() {
-        var recomposeLois: (() -> Unit)? = null
+    fun testComposePartOfTree() = compositionTest {
+        var recomposeLois = { }
 
-        @Composable fun MockComposeScope.Reporter(report: Report? = null) {
+        @Composable
+        fun Reporter(report: Report? = null) {
             if (report != null) {
                 if (report.from == "Lois" || report.to == "Lois") recomposeLois = invalidate
-                text(report.from)
-                text("reports to")
-                text(report.to)
+                Text(report.from)
+                Text("reports to")
+                Text(report.to)
             } else {
-                text("no report to report")
+                Text("no report to report")
             }
         }
 
-        @Composable fun MockComposeScope.reportsReport(reports: Iterable<Report>) {
-            linear {
-                repeat(of = reports) { report ->
+        @Composable
+        fun ReportsReport(reports: Iterable<Report>) {
+            Linear {
+                Repeated(of = reports) { report ->
                     Reporter(report)
                 }
             }
@@ -666,61 +693,62 @@
             rob_reports_to_alice,
             clark_reports_to_lois, r
         )
-        val result = compose {
-            reportsReport(reports)
+        compose {
+            ReportsReport(reports)
         }
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
-                reportsTo(clark_reports_to_lois)
-                reportsTo(r)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
+                ReportsTo(clark_reports_to_lois)
+                ReportsTo(r)
             }
         }
 
-        result.expectNoChanges()
+        expectNoChanges()
 
         // Demote Perry
         r.from = "Perry"
         r.to = "Lois"
 
         // Compose only the Lois report
-        recomposeLois?.let { it() }
+        recomposeLois()
 
-        result.expectChanges()
+        expectChanges()
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
-                reportsTo(clark_reports_to_lois)
-                reportsTo(r)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
+                ReportsTo(clark_reports_to_lois)
+                ReportsTo(r)
             }
         }
     }
 
     @Test
-    fun testRecomposeWithReplace() {
-        var recomposeLois: (() -> Unit)? = null
+    fun testRecomposeWithReplace() = compositionTest {
+        var recomposeLois = { }
         var key = 0
 
-        @Composable fun MockComposeScope.Reporter(report: Report? = null) {
+        @Composable
+        fun Reporter(report: Report? = null) {
             if (report != null) {
                 if (report.from == "Lois" || report.to == "Lois") recomposeLois = invalidate
                 key(key) {
-                    text(report.from)
-                    text("reports to")
-                    text(report.to)
+                    Text(report.from)
+                    Text("reports to")
+                    Text(report.to)
                 }
             } else {
-                text("no report to report")
+                Text("no report to report")
             }
         }
 
-        @Composable fun MockComposeScope.reportsReport(reports: Iterable<Report>) {
-            linear {
-                repeat(of = reports) { report ->
+        @Composable fun ReportsReport(reports: Iterable<Report>) {
+            Linear {
+                Repeated(of = reports) { report ->
                     Reporter(report)
                 }
             }
@@ -732,20 +760,20 @@
             rob_reports_to_alice,
             clark_reports_to_lois, r
         )
-        val result = compose {
-            reportsReport(reports)
+        compose {
+            ReportsReport(reports)
         }
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
-                reportsTo(clark_reports_to_lois)
-                reportsTo(r)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
+                ReportsTo(clark_reports_to_lois)
+                ReportsTo(r)
             }
         }
 
-        result.expectNoChanges()
+        expectNoChanges()
 
         // Demote Perry
         r.from = "Perry"
@@ -755,45 +783,47 @@
         key = 2
 
         // Compose only the Lois report
-        recomposeLois?.let { it() }
+        recomposeLois()
 
-        result.expectChanges()
+        expectChanges()
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
-                reportsTo(clark_reports_to_lois)
-                reportsTo(r)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
+                ReportsTo(clark_reports_to_lois)
+                ReportsTo(r)
             }
         }
     }
 
     @Test
-    fun testInvalidationAfterRemoval() {
-        var recomposeLois = {}
+    fun testInvalidationAfterRemoval() = compositionTest {
+        var recomposeLois = { }
         val key = 0
 
-        @Composable fun MockComposeScope.Reporter(report: Report? = null) {
+        @Composable
+        fun Reporter(report: Report? = null) {
             if (report != null) {
                 val callback = invalidate
                 if (report.from == "Lois" || report.to == "Lois") recomposeLois = callback
                 key(key) {
-                    text(report.from)
-                    text("reports to")
-                    text(report.to)
+                    Text(report.from)
+                    Text("reports to")
+                    Text(report.to)
                 }
             } else {
-                text("no report to report")
+                Text("no report to report")
             }
         }
 
-        @Composable fun MockComposeScope.reportsReport(
+        @Composable
+        fun ReportsReport(
             reports: Iterable<Report>,
             include: (report: Report) -> Boolean
         ) {
-            linear {
-                repeat(of = reports) { report ->
+            Linear {
+                Repeated(of = reports) { report ->
                     if (include(report)) {
                         Reporter(report)
                     }
@@ -812,40 +842,40 @@
         val notLois: (report: Report) -> Boolean = { it.from != "Lois" && it.to != "Lois" }
 
         var filter = all
-        var changed = {}
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            reportsReport(reports, filter)
+            ReportsReport(reports, filter)
         }
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
-                reportsTo(clark_reports_to_lois)
-                reportsTo(r)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
+                ReportsTo(clark_reports_to_lois)
+                ReportsTo(r)
             }
         }
 
         filter = notLois
         changed()
-        result.expectChanges()
+        expectChanges()
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
             }
         }
 
         // Invalidate Lois which is now removed.
         recomposeLois()
-        result.expectNoChanges()
+        expectNoChanges()
 
-        result.validate {
-            linear {
-                reportsTo(jim_reports_to_sally)
-                reportsTo(rob_reports_to_alice)
+        validate {
+            Linear {
+                ReportsTo(jim_reports_to_sally)
+                ReportsTo(rob_reports_to_alice)
             }
         }
     }
@@ -853,9 +883,9 @@
     // remember()
 
     @Test
-    fun testSimpleRemember() {
+    fun testSimpleRemember() = compositionTest {
         var count = 0
-        var changed: (() -> Unit)? = null
+        var changed = { }
 
         class Wrapper(val value: Int) {
             init {
@@ -863,33 +893,34 @@
             }
         }
 
-        @Composable fun MockComposeScope.test(value: Int) {
+        @Composable
+        fun Test(value: Int) {
             changed = invalidate
             val w = remember { Wrapper(value) }
-            text("value = ${w.value}")
+            Text("value = ${w.value}")
         }
 
-        fun MockViewValidator.test(value: Int) {
-            text("value = $value")
+        fun MockViewValidator.Test(value: Int) {
+            Text("value = $value")
         }
 
-        val result = compose {
-            test(1)
+        compose {
+            Test(1)
         }
 
-        result.validate { test(1) }
+        validate { this.Test(1) }
 
         assertEquals(1, count)
 
-        changed!!()
-        result.expectNoChanges()
+        changed()
+        expectNoChanges()
 
         // Expect the previous instance to be remembered
         assertEquals(1, count)
     }
 
     @Test
-    fun testRememberOneParameter() {
+    fun testRememberOneParameter() = compositionTest {
         var count = 0
 
         class Wrapper(val value: Int) {
@@ -898,40 +929,41 @@
             }
         }
 
-        @Composable fun MockComposeScope.test(value: Int) {
+        @Composable
+        fun Test(value: Int) {
             val w = remember(value) { Wrapper(value) }
-            text("value = ${w.value}")
+            Text("value = ${w.value}")
         }
 
-        fun MockViewValidator.test(value: Int) {
-            text("value = $value")
+        fun MockViewValidator.Test(value: Int) {
+            Text("value = $value")
         }
 
         var value = 1
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            test(value)
+            Test(value)
         }
 
-        result.validate { test(1) }
+        validate { this.Test(1) }
 
         value = 2
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate { test(2) }
+        validate { this.Test(2) }
 
-        changed!!()
-        result.expectNoChanges()
+        changed()
+        expectNoChanges()
 
-        result.validate { test(2) }
+        validate { this.Test(2) }
 
         assertEquals(2, count)
     }
 
     @Test
-    fun testRememberTwoParameters() {
+    fun testRememberTwoParameters() = compositionTest {
         var count = 0
 
         class Wrapper(val a: Int, val b: Int) {
@@ -940,43 +972,44 @@
             }
         }
 
-        @Composable fun MockComposeScope.test(a: Int, b: Int) {
+        @Composable
+        fun Test(a: Int, b: Int) {
             val w = remember(a, b) { Wrapper(a, b) }
-            text("a = ${w.a} b = ${w.b}")
+            Text("a = ${w.a} b = ${w.b}")
         }
 
-        fun MockViewValidator.test(a: Int, b: Int) {
-            text("a = $a b = $b")
+        fun MockViewValidator.Test(a: Int, b: Int) {
+            Text("a = $a b = $b")
         }
 
         var p1 = 1
         var p2 = 2
-        var changed: (() -> Unit)? = null
+        var changed = { }
 
-        val result = compose {
+        compose {
             changed = invalidate
-            test(p1, p2)
+            Test(p1, p2)
         }
 
-        result.validate { test(1, 2) }
+        validate { this.Test(1, 2) }
 
         p1 = 2
         p2 = 3
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate { test(2, 3) }
+        validate { this.Test(2, 3) }
 
-        changed!!()
-        result.expectNoChanges()
+        changed()
+        expectNoChanges()
 
-        result.validate { test(2, 3) }
+        validate { this.Test(2, 3) }
 
         assertEquals(2, count)
     }
 
     @Test
-    fun testRememberThreeParameters() {
+    fun testRememberThreeParameters() = compositionTest {
         var count = 0
 
         class Wrapper(val a: Int, val b: Int, val c: Int) {
@@ -985,40 +1018,41 @@
             }
         }
 
-        @Composable fun MockComposeScope.test(a: Int, b: Int, c: Int) {
+        @Composable
+        fun Test(a: Int, b: Int, c: Int) {
             val w = remember(a, b, c) { Wrapper(a, b, c) }
-            text("a = ${w.a} b = ${w.b} c = ${w.c}")
+            Text("a = ${w.a} b = ${w.b} c = ${w.c}")
         }
 
-        fun MockViewValidator.test(a: Int, b: Int, c: Int) {
-            text("a = $a b = $b c = $c")
+        fun MockViewValidator.Test(a: Int, b: Int, c: Int) {
+            Text("a = $a b = $b c = $c")
         }
 
         var p3 = 3
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            test(1, 2, p3)
+            Test(1, 2, p3)
         }
 
-        result.validate { test(1, 2, 3) }
+        validate { this.Test(1, 2, 3) }
 
         p3 = 4
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate { test(1, 2, 4) }
+        validate { this.Test(1, 2, 4) }
 
-        changed!!()
-        result.expectNoChanges()
+        changed()
+        expectNoChanges()
 
-        result.validate { test(1, 2, 4) }
+        validate { this.Test(1, 2, 4) }
 
         assertEquals(2, count)
     }
 
     @Test
-    fun testRememberFourParameters() {
+    fun testRememberFourParameters() = compositionTest {
         var count = 0
 
         class Wrapper(val a: Int, val b: Int, val c: Int, val d: Int) {
@@ -1027,43 +1061,44 @@
             }
         }
 
-        @Composable fun MockComposeScope.test(a: Int, b: Int, c: Int, d: Int) {
+        @Composable
+        fun Test(a: Int, b: Int, c: Int, d: Int) {
             val w = remember(a, b, c, d) { Wrapper(a, b, c, d) }
-            text("a = ${w.a} b = ${w.b} c = ${w.c} d = ${w.d}")
+            Text("a = ${w.a} b = ${w.b} c = ${w.c} d = ${w.d}")
         }
 
-        fun MockViewValidator.test(a: Int, b: Int, c: Int, d: Int) {
-            text("a = $a b = $b c = $c d = $d")
+        fun MockViewValidator.Test(a: Int, b: Int, c: Int, d: Int) {
+            Text("a = $a b = $b c = $c d = $d")
         }
 
         var p3 = 3
         var p4 = 4
-        var changed: (() -> Unit)? = null
+        var changed = { }
 
-        val result = compose {
+        compose {
             changed = invalidate
-            test(1, 2, p3, p4)
+            Test(1, 2, p3, p4)
         }
 
-        result.validate { test(1, 2, 3, 4) }
+        validate { this.Test(1, 2, 3, 4) }
 
         p3 = 4
         p4 = 5
-        changed!!()
-        result.expectChanges()
+        changed()
+        expectChanges()
 
-        result.validate { test(1, 2, 4, 5) }
+        validate { this.Test(1, 2, 4, 5) }
 
-        changed!!()
-        result.expectNoChanges()
+        changed()
+        expectNoChanges()
 
-        result.validate { test(1, 2, 4, 5) }
+        validate { this.Test(1, 2, 4, 5) }
 
         assertEquals(2, count)
     }
 
     @Test
-    fun testRememberFiveParameters() {
+    fun testRememberFiveParameters() = compositionTest {
         var count = 0
 
         class Wrapper(val a: Int, val b: Int, val c: Int, val d: Int, val e: Int) {
@@ -1072,277 +1107,267 @@
             }
         }
 
-        @Composable fun MockComposeScope.test(a: Int, b: Int, c: Int, d: Int, e: Int) {
+        @Composable
+        fun Test(a: Int, b: Int, c: Int, d: Int, e: Int) {
             val w = remember(a, b, c, d, e) { Wrapper(a, b, c, d, e) }
-            text("a = ${w.a} b = ${w.b} c = ${w.c} d = ${w.d} e = ${w.e}")
+            Text("a = ${w.a} b = ${w.b} c = ${w.c} d = ${w.d} e = ${w.e}")
         }
 
-        fun MockViewValidator.test(a: Int, b: Int, c: Int, d: Int, e: Int) {
-            text("a = $a b = $b c = $c d = $d e = $e")
+        fun MockViewValidator.Test(a: Int, b: Int, c: Int, d: Int, e: Int) {
+            Text("a = $a b = $b c = $c d = $d e = $e")
         }
 
         var lastParameter = 5
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            test(1, 2, 3, 4, lastParameter)
+            Test(1, 2, 3, 4, lastParameter)
         }
 
-        result.validate { test(1, 2, 3, 4, 5) }
+        validate { this.Test(1, 2, 3, 4, 5) }
 
         lastParameter = 6
-        changed!!()
+        changed()
 
-        result.expectChanges()
+        expectChanges()
 
-        result.validate { test(1, 2, 3, 4, 6) }
+        validate { this.Test(1, 2, 3, 4, 6) }
 
-        result.expectNoChanges()
+        expectNoChanges()
 
-        result.validate { test(1, 2, 3, 4, 6) }
+        validate { this.Test(1, 2, 3, 4, 6) }
 
         assertEquals(2, count)
     }
 
     @Test
-    fun testInsertGroupInContainer() {
-        val values = mutableListOf(0)
-        var changed: (() -> Unit)? = null
+    fun testInsertGroupInContainer() = compositionTest {
+        val values = mutableStateListOf(0)
 
-        @Composable fun MockComposeScope.composition() {
-            linear {
-                changed = invalidate
+        @Composable
+        fun Composition() {
+            Linear {
                 for (value in values) {
-                    memoize(value, value) {
-                        text("$value")
-                    }
+                    Text("$value")
                 }
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
+        fun MockViewValidator.Composition() {
+            Linear {
                 for (value in values)
-                    text("$value")
+                    Text("$value")
             }
         }
 
-        val result = compose { composition() }
+        compose { Composition() }
 
-        result.validate { composition() }
+        validate { this.Composition() }
 
         for (i in 1..10) {
             values.add(i)
-            changed!!()
-            result.expectChanges()
-            result.validate { composition() }
+            expectChanges()
+            validate { this.Composition() }
         }
     }
 
     // b/148273328
     @Test
-    fun testInsertInGroups() {
+    fun testInsertInGroups() = compositionTest {
+        var threeVisible by mutableStateOf(false)
 
-        var threeVisible = false
-        var changed: (() -> Unit)? = null
-
-        @Composable fun MockComposeScope.composition() {
-            linear {
-                text("one")
-                text("two")
-                changed = invalidate
+        @Composable fun Composition() {
+            Linear {
+                Text("one")
+                Text("two")
                 if (threeVisible) {
-                    text("three")
-                    text("four")
+                    Text("three")
+                    Text("four")
                 }
-                linear {
-                    text("five")
+                Linear {
+                    Text("five")
                 }
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
-                text("one")
-                text("two")
+        fun MockViewValidator.Composition() {
+            Linear {
+                Text("one")
+                Text("two")
                 if (threeVisible) {
-                    text("three")
-                    text("four")
+                    Text("three")
+                    Text("four")
                 }
-                linear {
-                    text("five")
+                Linear {
+                    Text("five")
                 }
             }
         }
 
-        val result = compose { composition() }
-        result.validate { composition() }
+        compose { Composition() }
+        validate { this.Composition() }
 
         threeVisible = true
-        changed!!()
-        result.expectChanges()
+        expectChanges()
 
-        result.validate { composition() }
+        validate { this.Composition() }
     }
 
     @Test
-    fun testStartJoin() {
-        var text = "Starting"
-        var myInvalidate: (() -> Unit)? = null
-        @Composable fun MockComposeScope.composition() {
-            linear {
-                myInvalidate = invalidate
-                text(text)
+    fun testStartJoin() = compositionTest {
+        var text by mutableStateOf("Starting")
+
+        @Composable
+        fun Composition() {
+            Linear {
+                Text(text)
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
-                text(text)
+        fun MockViewValidator.Composition() {
+            Linear {
+                Text(text)
             }
         }
 
-        val result = compose { composition() }
+        compose { Composition() }
 
-        result.validate { composition() }
+        validate { this.Composition() }
 
         text = "Ending"
-        myInvalidate?.let { it() }
 
-        result.expectChanges()
+        expectChanges()
 
-        result.validate { composition() }
+        validate { this.Composition() }
     }
 
     @Test
-    fun testInvalidateJoin_End() {
-        var text = "Starting"
-        var includeNested = true
-        var invalidate1 = {}
-        var invalidate2 = {}
+    fun testInvalidateJoin_End() = compositionTest {
+        var text by mutableStateOf("Starting")
+        var includeNested by mutableStateOf(true)
 
-        @Composable fun MockComposeScope.composition() {
-            linear {
-                invalidate1 = invalidate
-                text(text)
+        @Composable
+        fun Composition() {
+            Linear {
+                Text(text)
                 if (includeNested) {
-                    invalidate2 = invalidate
-                    text("Nested in $text")
+                    Text("Nested in $text")
                 }
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
-                text(text)
+        fun MockViewValidator.Composition() {
+            Linear {
+                Text(text)
                 if (includeNested) {
-                    text("Nested in $text")
+                    Text("Nested in $text")
                 }
             }
         }
 
-        val result = compose { composition() }
+        compose { Composition() }
 
-        result.validate { composition() }
+        validate { this.Composition() }
 
         text = "Ending"
         includeNested = false
-        invalidate1()
-        invalidate2()
 
-        result.expectChanges()
+        expectChanges()
 
-        result.validate { composition() }
+        validate { this.Composition() }
 
-        result.expectNoChanges()
+        expectNoChanges()
 
-        result.validate { composition() }
+        validate { this.Composition() }
     }
 
     @Test
-    fun testInvalidateJoin_Start() {
-        var text = "Starting"
-        var includeNested = true
-        var invalidate1: (() -> Unit)? = null
-        var invalidate2: (() -> Unit)? = null
+    fun testInvalidateJoin_Start() = compositionTest {
+        var text by mutableStateOf("Starting")
+        var includeNested by mutableStateOf(true)
 
-        @Composable fun MockComposeScope.composition() {
-            linear {
-                invalidate1 = invalidate
+        @Composable
+        fun Composition() {
+            Linear {
                 if (includeNested) {
-                    invalidate2 = invalidate
-                    text("Nested in $text")
+                    Text("Nested in $text")
                 }
-                text(text)
+                Text(text)
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
+        fun MockViewValidator.Composition() {
+            Linear {
                 if (includeNested) {
-                    text("Nested in $text")
+                    Text("Nested in $text")
                 }
-                text(text)
+                Text(text)
             }
         }
 
-        val result = compose { composition() }
+        compose { Composition() }
 
-        result.validate { composition() }
+        validate { this.Composition() }
 
         text = "Ending"
         includeNested = false
-        invalidate1?.invoke()
-        invalidate2?.invoke()
 
-        result.expectChanges()
+        expectChanges()
 
-        result.validate { composition() }
+        validate { this.Composition() }
 
-        result.expectNoChanges()
+        expectNoChanges()
 
-        result.validate { composition() }
+        validate { this.Composition() }
     }
 
     // b/132638679
     @Test
-    fun testJoinInvalidate() {
+    fun testJoinInvalidate() = compositionTest {
         var texts = 5
-        var invalidateOuter: (() -> Unit)? = null
-        var invalidateInner: (() -> Unit)? = null
+        var invalidateOuter = { }
+        var invalidateInner = { }
+        var forceInvalidate = false
 
-        @Composable fun MockComposeScope.composition() {
-            linear {
+        @Composable fun Composition() {
+            Linear {
                 invalidateOuter = invalidate
                 for (i in 1..texts) {
-                    text("Some text")
+                    Text("Some text")
                 }
 
                 Container {
-                    text("Some text")
+                    Text("Some text")
 
                     // Force the invalidation to survive the compose
                     val innerInvalidate = invalidate
-                    innerInvalidate()
                     invalidateInner = innerInvalidate
+                    if (forceInvalidate) {
+                        innerInvalidate()
+                        forceInvalidate = false
+                    }
                 }
             }
         }
 
-        val result = compose { composition() }
+        compose { Composition() }
 
         texts = 4
-        invalidateOuter?.invoke()
-        invalidateInner?.invoke()
-        result.expectChanges()
+        invalidateOuter()
+        invalidateInner()
+        forceInvalidate = true
+        expectChanges()
 
         texts = 3
-        invalidateOuter?.invoke()
-        result.expectChanges()
+        invalidateOuter()
+        forceInvalidate = true
+        expectChanges()
+
+        expectNoChanges()
     }
 
     @Test
-    fun testLifecycle_Enter_Simple() {
+    fun testLifecycle_Enter_Simple() = compositionTest {
         val lifecycleObject = object : CompositionLifecycleObserver {
             var count = 0
             override fun onEnter() {
@@ -1354,37 +1379,39 @@
             }
         }
 
-        @Composable fun MockComposeScope.composition() {
-            linear {
+        var changed = { }
+
+        @Composable
+        fun Composition() {
+            Linear {
+                changed = invalidate
                 remember { lifecycleObject }
-                text("Some text")
+                Text("Some text")
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
-                text("Some text")
+        fun MockViewValidator.Composition() {
+            Linear {
+                Text("Some text")
             }
         }
 
-        var changed: (() -> Unit)? = null
-        val result = compose {
-            changed = invalidate
-            composition()
+        compose {
+            Composition()
         }
-        result.validate { composition() }
+        validate { this.Composition() }
 
         assertEquals(1, lifecycleObject.count, "object should have been notified of an enter")
 
-        changed!!()
-        result.expectNoChanges()
-        result.validate { composition() }
+        changed()
+        expectNoChanges()
+        validate { this.Composition() }
 
         assertEquals(1, lifecycleObject.count, "Object should have only been notified once")
     }
 
     @Test
-    fun testLifecycle_Enter_SingleNotification() {
+    fun testLifecycle_Enter_SingleNotification() = compositionTest {
         val lifecycleObject = object : CompositionLifecycleObserver {
             var count = 0
             override fun onEnter() {
@@ -1396,46 +1423,46 @@
             }
         }
 
-        @Composable fun MockComposeScope.composition() {
-            linear {
+        var value by mutableStateOf(0)
+        @Composable
+        fun Composition() {
+            Linear {
                 val l = remember { lifecycleObject }
                 assertEquals(lifecycleObject, l, "Lifecycle object should be returned")
-                text("Some text")
+                Text("Some text $value")
             }
-            linear {
+            Linear {
                 val l = remember { lifecycleObject }
                 assertEquals(lifecycleObject, l, "Lifecycle object should be returned")
-                text("Some other text")
+                Text("Some other text $value")
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
-                text("Some text")
+        fun MockViewValidator.Composition() {
+            Linear {
+                Text("Some text $value")
             }
-            linear {
-                text("Some other text")
+            Linear {
+                Text("Some other text $value")
             }
         }
 
-        var changed: (() -> Unit)? = null
-        val result = compose {
-            changed = invalidate
-            composition()
+        compose {
+            Composition()
         }
-        result.validate { composition() }
+        validate { this.Composition() }
 
         assertEquals(1, lifecycleObject.count, "object should have been notified of an enter")
 
-        changed!!()
-        result.expectNoChanges()
-        result.validate { composition() }
+        value++
+        expectChanges()
+        validate { this.Composition() }
 
         assertEquals(1, lifecycleObject.count, "Object should have only been notified once")
     }
 
     @Test
-    fun testLifecycle_Leave_Simple() {
+    fun testLifecycle_Leave_Simple() = compositionTest {
         val lifecycleObject = object : CompositionLifecycleObserver {
             var count = 0
             override fun onEnter() {
@@ -1447,54 +1474,55 @@
             }
         }
 
-        @Composable fun MockComposeScope.composition(includeLifecycleObject: Boolean) {
-            linear {
+        @Composable
+        fun Composition(includeLifecycleObject: Boolean) {
+            Linear {
                 if (includeLifecycleObject) {
-                    linear {
+                    Linear {
                         val l = remember { lifecycleObject }
                         assertEquals(lifecycleObject, l, "Lifecycle object should be returned")
-                        text("Some text")
+                        Text("Some text")
                     }
                 }
             }
         }
 
-        fun MockViewValidator.composition(includeLifecycleObject: Boolean) {
-            linear {
+        fun MockViewValidator.Composition(includeLifecycleObject: Boolean) {
+            Linear {
                 if (includeLifecycleObject) {
-                    linear {
-                        text("Some text")
+                    Linear {
+                        Text("Some text")
                     }
                 }
             }
         }
 
-        var changed: (() -> Unit)? = null
+        var changed = { }
         var value = true
-        val result = compose {
+        compose {
             changed = invalidate
-            composition(value)
+            Composition(value)
         }
-        result.validate { composition(true) }
+        validate { this.Composition(true) }
 
         assertEquals(1, lifecycleObject.count, "object should have been notified of an enter")
 
-        changed!!()
-        result.expectNoChanges()
-        result.validate { composition(true) }
+        changed()
+        expectNoChanges()
+        validate { this.Composition(true) }
 
         assertEquals(1, lifecycleObject.count, "Object should have only been notified once")
 
         value = false
-        changed!!()
-        result.expectChanges()
-        result.validate { composition(false) }
+        changed()
+        expectChanges()
+        validate { this.Composition(false) }
 
         assertEquals(0, lifecycleObject.count, "Object should have been notified of a leave")
     }
 
     @Test
-    fun testLifecycle_Leave_NoLeaveOnReenter() {
+    fun testLifecycle_Leave_NoLeaveOnReenter() = compositionTest {
         var expectedEnter = true
         var expectedLeave = true
         val lifecycleObject = object : CompositionLifecycleObserver {
@@ -1510,53 +1538,54 @@
             }
         }
 
-        @Composable fun MockComposeScope.composition(a: Boolean, b: Boolean, c: Boolean) {
-            linear {
+        @Composable
+        fun Composition(a: Boolean, b: Boolean, c: Boolean) {
+            Linear {
                 if (a) {
                     key(1) {
-                        linear {
+                        Linear {
                             val l = remember { lifecycleObject }
                             assertEquals(lifecycleObject, l, "Lifecycle object should be returned")
-                            text("a")
+                            Text("a")
                         }
                     }
                 }
                 if (b) {
                     key(2) {
-                        linear {
+                        Linear {
                             val l = remember { lifecycleObject }
                             assertEquals(lifecycleObject, l, "Lifecycle object should be returned")
-                            text("b")
+                            Text("b")
                         }
                     }
                 }
                 if (c) {
                     key(3) {
-                        linear {
+                        Linear {
                             val l = remember { lifecycleObject }
                             assertEquals(lifecycleObject, l, "Lifecycle object should be returned")
-                            text("c")
+                            Text("c")
                         }
                     }
                 }
             }
         }
 
-        fun MockViewValidator.composition(a: Boolean, b: Boolean, c: Boolean) {
-            linear {
+        fun MockViewValidator.Composition(a: Boolean, b: Boolean, c: Boolean) {
+            Linear {
                 if (a) {
-                    linear {
-                        text("a")
+                    Linear {
+                        Text("a")
                     }
                 }
                 if (b) {
-                    linear {
-                        text("b")
+                    Linear {
+                        Text("b")
                     }
                 }
                 if (c) {
-                    linear {
-                        text("c")
+                    Linear {
+                        Text("c")
                     }
                 }
             }
@@ -1568,13 +1597,13 @@
         var a = true
         var b = false
         var c = false
-        var changed: (() -> Unit)? = null
-        val result = compose {
+        var changed = { }
+        compose {
             changed = invalidate
-            composition(a = a, b = b, c = c)
+            Composition(a = a, b = b, c = c)
         }
-        result.validate {
-            composition(
+        validate {
+            this.Composition(
                 a = true,
                 b = false,
                 c = false
@@ -1589,10 +1618,10 @@
 
         expectedEnter = false
         expectedLeave = false
-        changed!!()
-        result.expectNoChanges()
-        result.validate {
-            composition(
+        changed()
+        expectNoChanges()
+        validate {
+            this.Composition(
                 a = true,
                 b = false,
                 c = false
@@ -1609,10 +1638,10 @@
         a = false
         b = true
         c = false
-        changed!!()
-        result.expectChanges()
-        result.validate {
-            composition(
+        changed()
+        expectChanges()
+        validate {
+            this.Composition(
                 a = false,
                 b = true,
                 c = false
@@ -1625,10 +1654,10 @@
         a = false
         b = false
         c = true
-        changed!!()
-        result.expectChanges()
-        result.validate {
-            composition(
+        changed()
+        expectChanges()
+        validate {
+            this.Composition(
                 a = false,
                 b = false,
                 c = true
@@ -1641,10 +1670,10 @@
         a = true
         b = false
         c = false
-        changed!!()
-        result.expectChanges()
-        result.validate {
-            composition(
+        changed()
+        expectChanges()
+        validate {
+            this.Composition(
                 a = true,
                 b = false,
                 c = false
@@ -1657,10 +1686,10 @@
         a = false
         b = false
         c = false
-        changed!!()
-        result.expectChanges()
-        result.validate {
-            composition(
+        changed()
+        expectChanges()
+        validate {
+            this.Composition(
                 a = false,
                 b = false,
                 c = false
@@ -1670,7 +1699,7 @@
     }
 
     @Test
-    fun testLifecycle_Leave_LeaveOnReplace() {
+    fun testLifecycle_Leave_LeaveOnReplace() = compositionTest {
         val lifecycleObject1 = object : CompositionLifecycleObserver {
             var count = 0
             override fun onEnter() {
@@ -1696,50 +1725,51 @@
         var lifecycleObject: Any = lifecycleObject1
         var changed = {}
 
-        @Composable fun MockComposeScope.composition(obj: Any) {
-            linear {
+        @Composable
+        fun Composition(obj: Any) {
+            Linear {
                 key(1) {
-                    linear {
+                    Linear {
                         remember(obj) { obj }
-                        text("Some value")
+                        Text("Some value")
                     }
                 }
             }
         }
 
-        fun MockViewValidator.composition() {
-            linear {
-                linear {
-                    text("Some value")
+        fun MockViewValidator.Composition() {
+            Linear {
+                Linear {
+                    Text("Some value")
                 }
             }
         }
 
-        val result = compose {
+        compose {
             changed = invalidate
-            composition(obj = lifecycleObject)
+            Composition(obj = lifecycleObject)
         }
-        result.validate { composition() }
+        validate { this.Composition() }
         assertEquals(1, lifecycleObject1.count, "first object should enter")
         assertEquals(0, lifecycleObject2.count, "second object should not have entered")
 
         lifecycleObject = lifecycleObject2
         changed()
-        result.expectChanges()
-        result.validate { composition() }
+        expectChanges()
+        validate { Composition() }
         assertEquals(0, lifecycleObject1.count, "first object should have left")
         assertEquals(1, lifecycleObject2.count, "second object should have entered")
 
         lifecycleObject = object {}
         changed()
-        result.expectChanges()
-        result.validate { composition() }
+        expectChanges()
+        validate { Composition() }
         assertEquals(0, lifecycleObject1.count, "first object should have left")
         assertEquals(0, lifecycleObject2.count, "second object should have left")
     }
 
     @Test
-    fun testLifecycle_EnterLeaveOrder() {
+    fun testLifecycle_EnterLeaveOrder() = compositionTest {
         var order = 0
         val objects = mutableListOf<Any>()
         val newLifecycleObject = { name: String ->
@@ -1766,10 +1796,11 @@
             }.also { objects.add(it) }
         }
 
-        @Composable fun MockComposeScope.lifecycleUser(name: String) {
-            linear {
+        @Composable
+        fun LifecycleUser(name: String) {
+            Linear {
                 remember(name) { newLifecycleObject(name) }
-                text(value = name)
+                Text(value = name)
             }
         }
 
@@ -1789,41 +1820,41 @@
         Should leave as: J, I, H, G, F, E, D, C, B, A
         */
 
-        @Composable fun MockComposeScope.tree() {
-            linear {
-                lifecycleUser("A")
-                linear {
-                    lifecycleUser("B")
-                    linear {
-                        lifecycleUser("C")
-                        lifecycleUser("D")
+        @Composable
+        fun Tree() {
+            Linear {
+                LifecycleUser("A")
+                Linear {
+                    LifecycleUser("B")
+                    Linear {
+                        LifecycleUser("C")
+                        LifecycleUser("D")
                     }
-                    lifecycleUser("E")
-                    lifecycleUser("F")
-                    linear {
-                        lifecycleUser("G")
-                        lifecycleUser("H")
-                        linear {
-                            lifecycleUser("I")
+                    LifecycleUser("E")
+                    LifecycleUser("F")
+                    Linear {
+                        LifecycleUser("G")
+                        LifecycleUser("H")
+                        Linear {
+                            LifecycleUser("I")
                         }
                     }
-                    lifecycleUser("J")
+                    LifecycleUser("J")
                 }
             }
         }
 
-        @Composable fun MockComposeScope.composition(includeTree: Boolean) {
-            linear {
-                if (includeTree) tree()
+        @Composable
+        fun Composition(includeTree: Boolean) {
+            Linear {
+                if (includeTree) Tree()
             }
         }
 
-        var value = true
-        var changed: (() -> Unit)? = null
+        var value by mutableStateOf(true)
 
-        val result = compose {
-            changed = invalidate
-            composition(value)
+        compose {
+            Composition(value)
         }
 
         assertTrue(
@@ -1832,8 +1863,7 @@
         )
 
         value = false
-        changed!!()
-        result.expectChanges()
+        expectChanges()
 
         assertTrue(
             objects.mapNotNull { it as? Counted }.map { it.count == 0 }.all { it },
@@ -1858,7 +1888,7 @@
     }
 
     @Test
-    fun testCompoundKeyHashStaysTheSameAfterRecompositions() {
+    fun testCompoundKeyHashStaysTheSameAfterRecompositions() = compositionTest {
         val outerKeys = mutableListOf<Int>()
         val innerKeys = mutableListOf<Int>()
         var previousOuterKeysSize = 0
@@ -1867,11 +1897,11 @@
         var innerInvalidate: (() -> Unit) = {}
 
         @Composable
-        fun MockComposeScope.test() {
+        fun Test() {
             outerInvalidate = invalidate
             outerKeys.add(currentComposer.currentCompoundKeyHash)
             Container {
-                linear {
+                Linear {
                     innerInvalidate = invalidate
                     innerKeys.add(currentComposer.currentCompoundKeyHash)
                 }
@@ -1880,8 +1910,8 @@
             assertEquals(outerKeys.last(), currentComposer.currentCompoundKeyHash)
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
         assertNotEquals(previousOuterKeysSize, outerKeys.size)
@@ -1889,12 +1919,12 @@
 
         previousOuterKeysSize = outerKeys.size
         outerInvalidate()
-        result.expectNoChanges()
+        expectNoChanges()
         assertNotEquals(previousOuterKeysSize, outerKeys.size)
 
         previousInnerKeysSize = innerKeys.size
         innerInvalidate()
-        result.expectNoChanges()
+        expectNoChanges()
         assertNotEquals(previousInnerKeysSize, innerKeys.size)
 
         assertNotEquals(innerKeys[0], outerKeys[0])
@@ -1907,25 +1937,25 @@
     }
 
     @Test // b/152753046
-    fun testSwappingGroups() {
+    fun testSwappingGroups() = compositionTest {
         val items = mutableListOf(0, 1, 2, 3, 4)
         var invalidateComposition = {}
 
         @Composable
-        fun MockComposeScope.noNodes() { }
+        fun NoNodes() { }
 
         @Composable
-        fun MockComposeScope.test() {
+        fun Test() {
             invalidateComposition = invalidate
             for (item in items) {
                 key(item) {
-                    noNodes()
+                    NoNodes()
                 }
             }
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
         // Swap 2 and 3
@@ -1933,11 +1963,11 @@
         items[3] = 2
         invalidateComposition()
 
-        result.expectChanges()
+        expectChanges()
     }
 
     @Test // b/154650546
-    fun testInsertOnMultipleLevels() {
+    fun testInsertOnMultipleLevels() = compositionTest {
         val items = mutableListOf(
             1 to mutableListOf(
                 0, 1, 2, 3, 4
@@ -1954,70 +1984,70 @@
         }
 
         @Composable
-        fun MockComposeScope.numbers(numbers: List<Int>) {
-            linear {
-                linear {
+        fun Numbers(numbers: List<Int>) {
+            Linear {
+                Linear {
                     invalidates.add(invalidate)
                     for (number in numbers) {
-                        text("$number")
+                        Text("$number")
                     }
                 }
             }
         }
 
         @Composable
-        fun MockComposeScope.item(number: Int, numbers: List<Int>) {
-            linear {
+        fun Item(number: Int, numbers: List<Int>) {
+            Linear {
                 invalidates.add(invalidate)
-                text("$number")
-                numbers(numbers)
+                Text("$number")
+                Numbers(numbers)
             }
         }
 
         @Composable
-        fun MockComposeScope.test() {
+        fun Test() {
             invalidates.add(invalidate)
 
-            linear {
+            Linear {
                 invalidates.add(invalidate)
                 for ((number, numbers) in items) {
-                    item(number, numbers)
+                    Item(number, numbers)
                 }
             }
         }
 
         fun MockViewValidator.numbers(numbers: List<Int>) {
-            linear {
-                linear {
+            Linear {
+                Linear {
                     for (number in numbers) {
-                        text("$number")
+                        Text("$number")
                     }
                 }
             }
         }
 
         fun MockViewValidator.item(number: Int, numbers: List<Int>) {
-            linear {
-                text("$number")
+            Linear {
+                Text("$number")
                 numbers(numbers)
             }
         }
 
-        fun MockViewValidator.test() {
-            linear {
+        fun MockViewValidator.Test() {
+            Linear {
                 for ((number, numbers) in items) {
                     item(number, numbers)
                 }
             }
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
         fun validate() {
-            result.validate {
-                test()
+            validate {
+                this.Test()
             }
         }
 
@@ -2032,12 +2062,12 @@
 
         invalidateComposition()
 
-        result.expectChanges()
+        expectChanges()
         validate()
     }
 
     @Test
-    fun testInsertingAfterSkipping() {
+    fun testInsertingAfterSkipping() = compositionTest {
         val items = mutableListOf(
             1 to listOf(0, 1, 2, 3, 4)
         )
@@ -2049,55 +2079,54 @@
         }
 
         @Composable
-        fun MockComposeScope.test() {
+        fun Test() {
             invalidates.add(invalidate)
 
-            linear {
+            Linear {
                 for ((item, numbers) in items) {
-                    text(item.toString())
-                    linear {
+                    Text(item.toString())
+                    Linear {
                         invalidates.add(invalidate)
                         for (number in numbers) {
-                            text(number.toString())
+                            Text(number.toString())
                         }
                     }
                 }
             }
         }
 
-        fun MockViewValidator.test() {
-            linear {
+        fun MockViewValidator.Test() {
+            Linear {
                 for ((item, numbers) in items) {
-                    text(item.toString())
-                    linear {
+                    Text(item.toString())
+                    Linear {
                         for (number in numbers) {
-                            text(number.toString())
+                            Text(number.toString())
                         }
                     }
                 }
             }
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
-        result.validate {
-            test()
+        validate {
+            this.Test()
         }
 
         items.add(2 to listOf(3, 4, 5, 6))
         invalidateComposition()
 
-        result.expectChanges()
-        result.validate {
-            test()
+        expectChanges()
+        validate {
+            this.Test()
         }
     }
 
     @Test
-    fun evenOddRecomposeGroup() {
-
+    fun evenOddRecomposeGroup() = compositionTest {
         var includeEven = true
         var includeOdd = true
         val invalidates = mutableListOf<() -> Unit>()
@@ -2110,122 +2139,122 @@
         }
 
         @Composable
-        fun MockComposeScope.wrapper(content: @Composable () -> Unit) {
+        fun Wrapper(content: @Composable () -> Unit) {
             content()
         }
 
         @Composable
-        fun MockComposeScope.emitText() {
+        fun EmitText() {
             invalidates.add(invalidate)
             if (includeOdd) {
                 key(1) {
-                    text("odd 1")
+                    Text("odd 1")
                 }
             }
             if (includeEven) {
                 key(2) {
-                    text("even 2")
+                    Text("even 2")
                 }
             }
             if (includeOdd) {
                 key(3) {
-                    text("odd 3")
+                    Text("odd 3")
                 }
             }
             if (includeEven) {
                 key(4) {
-                    text("even 4")
+                    Text("even 4")
                 }
             }
         }
 
         @Composable
-        fun MockComposeScope.test() {
-            linear {
-                wrapper {
-                    emitText()
+        fun Test() {
+            Linear {
+                Wrapper {
+                    EmitText()
                 }
-                emitText()
-                wrapper {
-                    emitText()
+                EmitText()
+                Wrapper {
+                    EmitText()
                 }
-                emitText()
+                EmitText()
             }
         }
 
-        fun MockViewValidator.wrapper(children: () -> Unit) {
+        fun MockViewValidator.Wrapper(children: () -> Unit) {
             children()
         }
 
-        fun MockViewValidator.emitText() {
+        fun MockViewValidator.EmitText() {
             if (includeOdd) {
-                text("odd 1")
+                Text("odd 1")
             }
             if (includeEven) {
-                text("even 2")
+                Text("even 2")
             }
             if (includeOdd) {
-                text("odd 3")
+                Text("odd 3")
             }
             if (includeEven) {
-                text("even 4")
+                Text("even 4")
             }
         }
 
-        fun MockViewValidator.test() {
-            linear {
-                wrapper {
-                    emitText()
+        fun MockViewValidator.Test() {
+            Linear {
+                this.Wrapper {
+                    this.EmitText()
                 }
-                emitText()
-                wrapper {
-                    emitText()
+                this.EmitText()
+                this.Wrapper {
+                    this.EmitText()
                 }
-                emitText()
+                this.EmitText()
             }
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
         fun validate() {
-            result.validate {
-                test()
+            validate {
+                this.Test()
             }
         }
         validate()
 
         includeEven = false
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         includeEven = true
         includeOdd = false
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         includeEven = false
         includeOdd = false
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         includeEven = true
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         includeOdd = true
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
     }
 
     @Test
-    fun evenOddWithMovement() {
+    fun evenOddWithMovement() = compositionTest {
         var includeEven = true
         var includeOdd = true
         var order = listOf(1, 2, 3, 4)
@@ -2239,84 +2268,84 @@
         }
 
         @Composable
-        fun MockComposeScope.emitText(all: Boolean) {
+        fun EmitText(all: Boolean) {
             invalidates.add(invalidate)
             for (i in order) {
                 if (i % 2 == 1 && (all || includeOdd)) {
                     key(i) {
-                        text("odd $i")
+                        Text("odd $i")
                     }
                 }
                 if (i % 2 == 0 && (all || includeEven)) {
                     key(i) {
-                        text("even $i")
+                        Text("even $i")
                     }
                 }
             }
         }
 
         @Composable
-        fun MockComposeScope.test() {
-            linear {
+        fun Test() {
+            Linear {
                 invalidates.add(invalidate)
                 for (i in order) {
                     key(i) {
-                        text("group $i")
+                        Text("group $i")
                         if (i == 2 || (includeEven && includeOdd)) {
-                            text("including everything")
+                            Text("including everything")
                         } else {
                             if (includeEven) {
-                                text("including evens")
+                                Text("including evens")
                             }
                             if (includeOdd) {
-                                text("including odds")
+                                Text("including odds")
                             }
                         }
-                        emitText(i == 2)
+                        EmitText(i == 2)
                     }
                 }
-                emitText(false)
+                EmitText(false)
             }
         }
 
-        fun MockViewValidator.emitText(all: Boolean) {
+        fun MockViewValidator.EmitText(all: Boolean) {
             for (i in order) {
                 if (i % 2 == 1 && (includeOdd || all)) {
-                    text("odd $i")
+                    Text("odd $i")
                 }
                 if (i % 2 == 0 && (includeEven || all)) {
-                    text("even $i")
+                    Text("even $i")
                 }
             }
         }
 
-        fun MockViewValidator.test() {
-            linear {
+        fun MockViewValidator.Test() {
+            Linear {
                 for (i in order) {
-                    text("group $i")
+                    Text("group $i")
                     if (i == 2 || (includeEven && includeOdd)) {
-                        text("including everything")
+                        Text("including everything")
                     } else {
                         if (includeEven) {
-                            text("including evens")
+                            Text("including evens")
                         }
                         if (includeOdd) {
-                            text("including odds")
+                            Text("including odds")
                         }
                     }
-                    emitText(i == 2)
+                    this.EmitText(i == 2)
                 }
-                emitText(false)
+                this.EmitText(false)
             }
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
         fun validate() {
-            result.validate {
-                test()
+            validate {
+                this.Test()
             }
         }
         validate()
@@ -2324,78 +2353,75 @@
         order = listOf(1, 2, 4, 3)
         includeEven = false
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         order = listOf(1, 4, 2, 3)
         includeEven = true
         includeOdd = false
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         order = listOf(3, 4, 2, 1)
         includeEven = false
         includeOdd = false
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         order = listOf(4, 3, 2, 1)
         includeEven = true
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
 
         order = listOf(1, 2, 3, 4)
         includeOdd = true
         invalidateComposition()
-        result.expectChanges()
+        expectChanges()
         validate()
     }
 
     @Test
-    fun testObservationScopes() {
+    fun testObservationScopes() = compositionTest {
         val states = mutableListOf<MutableState<Int>>()
         var iterations = 0
 
-        @Composable fun MockComposeScope.test() {
+        @Composable
+        fun Test() {
             val s1 = mutableStateOf(iterations++)
-            text("s1 ${s1.value}")
+            Text("s1 ${s1.value}")
             states.add(s1)
             val s2 = mutableStateOf(iterations++)
-            text("s2 ${s2.value}")
+            Text("s2 ${s2.value}")
             states.add(s2)
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
-        result.observe {
-            fun invalidateFirst() {
-                states.first().value++
-                Snapshot.sendApplyNotifications()
-            }
-
-            fun invalidateLast() {
-                states.last().value++
-                Snapshot.sendApplyNotifications()
-            }
-
-            repeat(10) {
-                invalidateLast()
-                result.expectChanges()
-            }
-
-            invalidateFirst()
-            result.expectNoChanges()
+        fun invalidateFirst() {
+            states.first().value++
         }
+
+        fun invalidateLast() {
+            states.last().value++
+        }
+
+        repeat(10) {
+            invalidateLast()
+            expectChanges()
+        }
+
+        invalidateFirst()
+        expectNoChanges()
     }
 
     @OptIn(ComposeCompilerApi::class)
     @Test
-    fun testApplierBeginEndCallbacks() {
+    fun testApplierBeginEndCallbacks() = compositionTest {
         val checks = mutableListOf<String>()
         compose {
             val myComposer = currentComposer
@@ -2446,66 +2472,72 @@
     }
 
     @Test // regression test for b/172660922
-    fun testInvalidationOfRemovedContent() {
+    fun testInvalidationOfRemovedContent() = compositionTest {
         var markS1Invalid: () -> Unit = {}
         var viewS1 by mutableStateOf(true)
-        @Composable fun MockComposeScope.s1() {
+        var performBackwardsWrite = true
+        @Composable
+        fun S1() {
             markS1Invalid = invalidate
-            text("In s1")
-            markS1Invalid()
+            Text("In s1")
         }
 
-        @Composable fun MockComposeScope.s2() {
-            text("In s2")
+        @Composable
+        fun S2() {
+            Text("In s2")
         }
 
-        @Composable fun MockComposeScope.test() {
-            text("$viewS1")
+        @Composable
+        fun Test() {
+            Text("$viewS1")
             Wrap {
                 if (viewS1) {
-                    s1()
+                    S1()
                 }
-                s2()
+                S2()
             }
 
-            // This forces the equivalent of a backwards write.
-            markS1Invalid()
+            if (performBackwardsWrite) {
+                // This forces the equivalent of a backwards write.
+                markS1Invalid()
+                performBackwardsWrite = false
+            }
         }
 
-        fun MockViewValidator.s1() {
-            text("In s1")
+        fun MockViewValidator.S1() {
+            Text("In s1")
         }
 
-        fun MockViewValidator.s2() {
-            text("In s2")
+        fun MockViewValidator.S2() {
+            Text("In s2")
         }
 
-        fun MockViewValidator.test() {
-            text("$viewS1")
+        fun MockViewValidator.Test() {
+            Text("$viewS1")
             if (viewS1) {
-                s1()
+                this.S1()
             }
-            s2()
+            this.S2()
         }
 
-        val result = compose {
-            test()
+        compose {
+            Test()
         }
 
-        fun validate() = result.validate { test() }
+        fun validate() = validate { this.Test() }
 
         validate()
 
         markS1Invalid()
-        result.expectNoChanges()
+        performBackwardsWrite = true
+        expectNoChanges()
 
         validate()
 
-        result.observe {
-            viewS1 = false
-            result.expectChanges()
-            validate()
-        }
+        viewS1 = false
+        performBackwardsWrite = true
+        expectChanges()
+        validate()
     }
 
     /**
@@ -2730,101 +2762,6 @@
     }
 }
 
-@OptIn(InternalComposeApi::class, ExperimentalComposeApi::class)
-private class CompositionResult(
-    val composer: Composer<*>,
-    val root: View
-) {
-    fun validate(block: MockViewValidator.() -> Unit) {
-        MockViewListValidator(root.children).validate(block)
-    }
-
-    fun expectNoChanges() {
-        val changes = recompose() && composer.changeCount > 0
-        assertFalse(changes, "Changes detected when they were not expected")
-    }
-
-    fun expectChanges() {
-        val changes = recompose() && composer.changeCount > 0
-        assertTrue(changes, "Expected changes")
-        composer.applyChanges()
-        Snapshot.notifyObjectsInitialized()
-        composer.verifyConsistent()
-    }
-
-    fun recompose(): Boolean = doCompose(composer) { composer.recompose() }
-
-    fun observe(block: () -> Unit) {
-        val unregister = Snapshot.registerApplyObserver { changed, _ ->
-            composer.recordModificationsOf(changed)
-        }
-        try {
-            block()
-        } finally {
-            unregister()
-        }
-    }
-}
-
-@OptIn(InternalComposeApi::class, ExperimentalComposeApi::class)
-private fun <T> doCompose(composer: Composer<*>, block: () -> T): T {
-    val snapshot = takeMutableSnapshot(
-        {
-            composer.recordReadOf(it)
-        },
-        {
-            composer.recordWriteOf(it)
-        }
-    )
-    return try {
-        snapshot.enter { block() }.also {
-            snapshot.apply().check()
-        }
-    } finally {
-        snapshot.dispose()
-    }
-}
-
-/**
- * Composer the given block.
- */
-@OptIn(InternalComposeApi::class, ExperimentalComposeApi::class)
-private fun compose(
-    block: @Composable MockComposeScope.() -> Unit
-): CompositionResult {
-    val root = View().apply { name = "root" }
-    val composer = run {
-        val scope = CoroutineScope(Job())
-        val clock = object : MonotonicFrameClock {
-            override suspend fun <R> withFrameNanos(onFrame: (Long) -> R): R {
-                // The original version of this test used a mock Recomposer
-                // that never successfully scheduled a frame.
-                suspendCancellableCoroutine<Unit> {}
-                return onFrame(0)
-            }
-        }
-        val recomposer = Recomposer(scope.coroutineContext).apply {
-            scope.launch(clock) { runRecomposeAndApplyChanges() }
-        }
-        Composer(
-            ViewApplier(root),
-            recomposer
-        )
-    }
-
-    val mockScope = MockComposeScope()
-    doCompose(composer) {
-        composer.composeInitial {
-            mockScope.block()
-        }
-        Snapshot.notifyObjectsInitialized()
-        composer.applyChanges()
-    }
-    composer.verifyConsistent()
-
-    return CompositionResult(composer, root)
-}
-
 // Contact test data
 private val bob = Contact("Bob Smith", email = "bob@smith.com")
 private val jon = Contact(name = "Jon Alberton", email = "jon@alberton.com")
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeContact.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeContact.kt
index 786d6b6..d85c2d3 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeContact.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeContact.kt
@@ -24,17 +24,17 @@
 // </linear>
 @Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.contact(contact: Contact) {
-    linear {
-        text(value = "Name: ${contact.name}")
-        text(value = "email: ${contact.email}")
+fun contact(contact: Contact) {
+    Linear {
+        Text(value = "Name: ${contact.name}")
+        Text(value = "email: ${contact.email}")
     }
 }
 
 fun MockViewValidator.contact(contact: Contact) {
-    linear {
-        text(value = "Name: ${contact.name}")
-        text(value = "email: ${contact.email}")
+    Linear {
+        Text(value = "Name: ${contact.name}")
+        Text(value = "email: ${contact.email}")
     }
 }
 
@@ -47,10 +47,10 @@
 // </linear>
 @Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.contacts(contacts: Collection<Contact>, selected: Contact?) {
-    linear {
-        repeat(of = contacts) {
-            selectBox(it == selected) {
+fun contacts(contacts: Collection<Contact>, selected: Contact?) {
+    Linear {
+        Repeated(of = contacts) {
+            SelectBox(it == selected) {
                 contact(it)
             }
         }
@@ -58,9 +58,9 @@
 }
 
 fun MockViewValidator.contacts(contacts: Collection<Contact>, selected: Contact?) {
-    linear {
-        repeat(of = contacts) {
-            selectBox(it == selected) {
+    Linear {
+        Repeated(of = contacts) {
+            SelectBox(it == selected) {
                 contact(it)
             }
         }
@@ -79,29 +79,29 @@
 // </linear>
 @Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.selectContact(model: ContactModel) {
-    linear {
-        linear {
-            text(value = "Filter:")
-            edit(value = model.filter)
+fun SelectContact(model: ContactModel) {
+    Linear {
+        Linear {
+            Text(value = "Filter:")
+            Edit(value = model.filter)
         }
 
-        linear {
-            text(value = "Contacts:")
+        Linear {
+            Text(value = "Contacts:")
             contacts(model.filtered, model.selected)
         }
     }
 }
 
-fun MockViewValidator.selectContact(model: ContactModel) {
-    linear {
-        linear {
-            text(value = "Filter:")
-            edit(value = model.filter)
+fun MockViewValidator.SelectContact(model: ContactModel) {
+    Linear {
+        Linear {
+            Text(value = "Filter:")
+            Edit(value = model.filter)
         }
 
-        linear {
-            text(value = "Contacts:")
+        Linear {
+            Text(value = "Contacts:")
             contacts(model.filtered, model.selected)
         }
     }
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposePoints.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposePoints.kt
index 4f7c1b1..dd2aff1 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposePoints.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposePoints.kt
@@ -18,28 +18,26 @@
 
 import androidx.compose.runtime.Composable
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.point(point: Point) {
-    text("X: ${point.x} Y: ${point.y}")
+fun Point(point: Point) {
+    Text("X: ${point.x} Y: ${point.y}")
 }
 
-fun MockViewValidator.point(point: Point) {
-    text("X: ${point.x} Y: ${point.y}")
+fun MockViewValidator.Point(point: Point) {
+    Text("X: ${point.x} Y: ${point.y}")
 }
 
 private const val SLPoints = 100
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.points(points: Iterable<Point>) {
-    repeat(of = points) {
-        memoize(SLPoints, it) { point(it) }
+fun Points(points: Iterable<Point>) {
+    Repeated(of = points) {
+        Point(it)
     }
 }
 
-fun MockViewValidator.points(points: Iterable<Point>) {
-    repeat(of = points) {
-        point(it)
+fun MockViewValidator.Points(points: Iterable<Point>) {
+    Repeated(of = points) {
+        Point(it)
     }
 }
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeReport.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeReport.kt
index cdf27bf..24333a9 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeReport.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ComposeReport.kt
@@ -18,34 +18,32 @@
 
 import androidx.compose.runtime.Composable
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.reportsTo(report: Report) {
-    text(report.from)
-    text("reports to")
-    text(report.to)
+fun ReportsTo(report: Report) {
+    Text(report.from)
+    Text("reports to")
+    Text(report.to)
 }
 
-fun MockViewValidator.reportsTo(report: Report) {
-    text(report.from)
-    text("reports to")
-    text(report.to)
+fun MockViewValidator.ReportsTo(report: Report) {
+    Text(report.from)
+    Text("reports to")
+    Text(report.to)
 }
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.reportsReport(reports: Iterable<Report>) {
-    linear {
-        repeat(of = reports) { report ->
-            reportsTo(report)
+fun ReportsReport(reports: Iterable<Report>) {
+    Linear {
+        Repeated(of = reports) { report ->
+            ReportsTo(report)
         }
     }
 }
 
-fun MockViewValidator.reportsReport(reports: Iterable<Report>) {
-    linear {
-        repeat(of = reports) { report ->
-            reportsTo(report)
+fun MockViewValidator.ReportsReport(reports: Iterable<Report>) {
+    Linear {
+        Repeated(of = reports) { report ->
+            ReportsTo(report)
         }
     }
 }
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/CompositionTest.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
new file mode 100644
index 0000000..deaedac
--- /dev/null
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/CompositionTest.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.runtime.mock
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Composition
+import androidx.compose.runtime.ExperimentalComposeApi
+import androidx.compose.runtime.InternalComposeApi
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.compositionFor
+import androidx.compose.runtime.snapshots.Snapshot
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.TestCoroutineScope
+import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.withContext
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+@OptIn(ExperimentalComposeApi::class, InternalComposeApi::class, ExperimentalCoroutinesApi::class)
+fun compositionTest(block: suspend CompositionTestScope.() -> Unit) = runBlockingTest {
+    withContext(TestMonotonicFrameClock(this)) {
+        // Start the recomposer
+        val recomposer = Recomposer(coroutineContext)
+        launch { recomposer.runRecomposeAndApplyChanges() }
+
+        // Create a test scope for the test using the test scope passed in by runBlockingTest
+        val scope = object : CompositionTestScope, TestCoroutineScope by this@runBlockingTest {
+            var composed = false
+            var composition: Composition? = null
+
+            override lateinit var root: View
+
+            override fun compose(block: @Composable () -> Unit) {
+                check(!composed) { "Compose should only be called once" }
+                composed = true
+                root = View().apply { name = "root" }
+                val composition = compositionFor(root, ViewApplier(root), recomposer)
+                this.composition = composition
+                composition.setContent(block)
+            }
+
+            override fun advance(): Boolean {
+                val changeCount = recomposer.changeCount
+                Snapshot.sendApplyNotifications()
+                if (recomposer.hasInvalidations()) {
+                    advanceTimeBy(5_000)
+                    check(!recomposer.hasInvalidations()) {
+                        "Potentially infinite recomposition, still recomposing after advancing"
+                    }
+                }
+                return recomposer.changeCount != changeCount
+            }
+        }
+        scope.block()
+        scope.composition?.dispose()
+        recomposer.shutDown()
+        recomposer.join()
+    }
+}
+
+/**
+ * A test scope used in tests that allows controlling and testing composition.
+ */
+@OptIn(ExperimentalCoroutinesApi::class)
+interface CompositionTestScope : TestCoroutineScope {
+    /**
+     * Compose a block using the mock view composer.
+     */
+    fun compose(block: @Composable () -> Unit)
+
+    /**
+     * Advance the state which executes any pending compositions, if any. Returns true if
+     * advancing resulted in changes being applied.
+     */
+    fun advance(): Boolean
+
+    /**
+     * The root mock view of the mock views being composed.
+     */
+    val root: View
+}
+
+/**
+ * Create a mock view validator and validate the view.
+ */
+fun CompositionTestScope.validate(block: MockViewValidator.() -> Unit) =
+    MockViewListValidator(root.children).validate(block)
+
+/**
+ * Advance and expect changes
+ */
+fun CompositionTestScope.expectChanges() {
+    val changes = advance()
+    assertTrue(
+        actual = changes,
+        message = "Expected changes but none were found"
+    )
+}
+
+/**
+ * Advance and expect no changes
+ */
+fun CompositionTestScope.expectNoChanges() {
+    val changes = advance()
+    assertFalse(
+        actual = changes,
+        message = "Expected no changes but changes occurred"
+    )
+}
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt
index 07b409d..20ae087 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/MockViewValidator.kt
@@ -56,25 +56,25 @@
     MockViewListValidator(view.children).validate(block)
 }
 
-fun <T> MockViewValidator.repeat(of: Iterable<T>, block: MockViewValidator.(value: T) -> Unit) {
+fun <T> MockViewValidator.Repeated(of: Iterable<T>, block: MockViewValidator.(value: T) -> Unit) {
     for (value in of) {
         block(value)
     }
 }
 
-fun MockViewValidator.linear() = view("linear", null)
-fun MockViewValidator.linear(block: MockViewValidator.() -> Unit) = view("linear", block)
+fun MockViewValidator.Linear() = view("linear", null)
+fun MockViewValidator.Linear(block: MockViewValidator.() -> Unit) = view("linear", block)
 fun MockViewValidator.box(block: MockViewValidator.() -> Unit) = view("box", block)
-fun MockViewValidator.text(value: String) {
+fun MockViewValidator.Text(value: String) {
     view("text")
     assertEquals(value, view.attributes["text"])
 }
-fun MockViewValidator.edit(value: String) {
+fun MockViewValidator.Edit(value: String) {
     view("edit")
     assertEquals(value, view.attributes["value"])
 }
 
-fun MockViewValidator.selectBox(selected: Boolean, block: MockViewValidator.() -> Unit) {
+fun MockViewValidator.SelectBox(selected: Boolean, block: MockViewValidator.() -> Unit) {
     if (selected) {
         box {
             block()
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ViewApplier.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ViewApplier.kt
index ae08758..69a78b5 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ViewApplier.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/ViewApplier.kt
@@ -17,12 +17,7 @@
 package androidx.compose.runtime.mock
 
 import androidx.compose.runtime.AbstractApplier
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.ComposeCompilerApi
-import androidx.compose.runtime.Composer
 import androidx.compose.runtime.ExperimentalComposeApi
-import androidx.compose.runtime.Stable
-import androidx.compose.runtime.currentComposer
 
 @Suppress("EXTENSION_SHADOWED_BY_MEMBER")
 @OptIn(ExperimentalComposeApi::class)
@@ -61,25 +56,3 @@
         onEndChangesCalled++
     }
 }
-
-@Stable
-class MockComposeScope
-
-// TODO(lmr): we should really remove this from our tests
-@Suppress("UNCHECKED_CAST", "ComposableNaming")
-@OptIn(ComposeCompilerApi::class)
-@Composable
-fun <P1> MockComposeScope.memoize(
-    key: Int,
-    p1: P1,
-    block: @Composable (p1: P1) -> Unit
-) {
-    currentComposer.startGroup(key)
-    if (!currentComposer.changed(p1)) {
-        currentComposer.skipToGroupEnd()
-    } else {
-        val realFn = block as Function3<P1, Composer<*>, Int, Unit>
-        realFn(p1, currentComposer, 0)
-    }
-    currentComposer.endGroup()
-}
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt
index 39cdb19..ec940bc 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/mock/Views.kt
@@ -20,11 +20,10 @@
 import androidx.compose.runtime.emit
 import androidx.compose.runtime.key
 
-@Suppress("ComposableNaming")
 @Composable
-fun <T : Any> MockComposeScope.repeat(
+fun <T : Any> Repeated(
     of: Iterable<T>,
-    block: @Composable MockComposeScope.(value: T) -> Unit
+    block: @Composable (value: T) -> Unit
 ) {
     for (value in of) {
         key(value) {
@@ -33,9 +32,8 @@
     }
 }
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.linear(content: @Composable MockComposeScope.() -> Unit) {
+fun Linear(content: @Composable () -> Unit) {
     emit<View, ViewApplier>(
         ctor = { View().also { it.name = "linear" } },
         update = { }
@@ -44,29 +42,26 @@
     }
 }
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.text(value: String) {
+fun Text(value: String) {
     emit<View, ViewApplier>(
         ctor = { View().also { it.name = "text" } },
         update = { set(value) { text = it } }
     )
 }
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.edit(value: String) {
+fun Edit(value: String) {
     emit<View, ViewApplier>(
         ctor = { View().also { it.name = "edit" } },
         update = { set(value) { this.value = it } }
     )
 }
 
-@Suppress("ComposableNaming")
 @Composable
-fun MockComposeScope.selectBox(
+fun SelectBox(
     selected: Boolean,
-    content: @Composable MockComposeScope.() -> Unit
+    content: @Composable () -> Unit
 ) {
     if (selected) {
         emit<View, ViewApplier>(
diff --git a/compose/ui/ui-geometry/api/current.txt b/compose/ui/ui-geometry/api/current.txt
index 74163e5..ef2658a 100644
--- a/compose/ui/ui-geometry/api/current.txt
+++ b/compose/ui/ui-geometry/api/current.txt
@@ -106,7 +106,7 @@
     method public static boolean isSpecified-k-4lQ0M(long);
     method public static inline boolean isUnspecified-k-4lQ0M(long);
     method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
-    method public static inline long useOrElse-Yy5JL0A(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+    method public static inline long takeOrElse-Yy5JL0A(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
   }
 
   @androidx.compose.runtime.Immutable public final class Rect {
@@ -273,11 +273,11 @@
     method public static inline boolean isSpecified-uvyYCjk(long);
     method public static inline boolean isUnspecified-uvyYCjk(long);
     method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
     method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
     method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
     method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
-    method public static inline long useOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
   }
 
 }
diff --git a/compose/ui/ui-geometry/api/public_plus_experimental_current.txt b/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
index 74163e5..ef2658a 100644
--- a/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-geometry/api/public_plus_experimental_current.txt
@@ -106,7 +106,7 @@
     method public static boolean isSpecified-k-4lQ0M(long);
     method public static inline boolean isUnspecified-k-4lQ0M(long);
     method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
-    method public static inline long useOrElse-Yy5JL0A(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+    method public static inline long takeOrElse-Yy5JL0A(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
   }
 
   @androidx.compose.runtime.Immutable public final class Rect {
@@ -273,11 +273,11 @@
     method public static inline boolean isSpecified-uvyYCjk(long);
     method public static inline boolean isUnspecified-uvyYCjk(long);
     method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
     method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
     method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
     method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
-    method public static inline long useOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
   }
 
 }
diff --git a/compose/ui/ui-geometry/api/restricted_current.txt b/compose/ui/ui-geometry/api/restricted_current.txt
index 74163e5..ef2658a 100644
--- a/compose/ui/ui-geometry/api/restricted_current.txt
+++ b/compose/ui/ui-geometry/api/restricted_current.txt
@@ -106,7 +106,7 @@
     method public static boolean isSpecified-k-4lQ0M(long);
     method public static inline boolean isUnspecified-k-4lQ0M(long);
     method @androidx.compose.runtime.Stable public static long lerp-tX6QBWo(long start, long stop, float fraction);
-    method public static inline long useOrElse-Yy5JL0A(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
+    method public static inline long takeOrElse-Yy5JL0A(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Offset> block);
   }
 
   @androidx.compose.runtime.Immutable public final class Rect {
@@ -273,11 +273,11 @@
     method public static inline boolean isSpecified-uvyYCjk(long);
     method public static inline boolean isUnspecified-uvyYCjk(long);
     method @androidx.compose.runtime.Stable public static long lerp-3tf5JpU(long start, long stop, float fraction);
+    method public static inline long takeOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
     method @androidx.compose.runtime.Stable public static inline operator long times-2DtskRk(float, long size);
     method @androidx.compose.runtime.Stable public static inline operator long times-B9jgaKk(double, long size);
     method @androidx.compose.runtime.Stable public static inline operator long times-cEP68aU(int, long size);
     method @androidx.compose.runtime.Stable public static androidx.compose.ui.geometry.Rect toRect-uvyYCjk(long);
-    method public static inline long useOrElse-GR1djXE(long, kotlin.jvm.functions.Function0<androidx.compose.ui.geometry.Size> block);
   }
 
 }
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
index 2b06f1b..bef6a9f 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Offset.kt
@@ -256,5 +256,5 @@
  * If this [Offset] [isSpecified] then this is returned, otherwise [block] is executed
  * and its result is returned.
  */
-inline fun Offset.useOrElse(block: () -> Offset): Offset =
+inline fun Offset.takeOrElse(block: () -> Offset): Offset =
     if (isSpecified) this else block()
diff --git a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt
index f99ffeb8..39a4b24 100644
--- a/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt
+++ b/compose/ui/ui-geometry/src/commonMain/kotlin/androidx/compose/ui/geometry/Size.kt
@@ -155,7 +155,7 @@
  * If this [Size] [isSpecified] then this is returned, otherwise [block] is executed
  * and its result is returned.
  */
-inline fun Size.useOrElse(block: () -> Size): Size =
+inline fun Size.takeOrElse(block: () -> Size): Size =
     if (isSpecified) this else block()
 
 /**
diff --git a/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/OffsetTest.kt b/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/OffsetTest.kt
index 1e7089a..5f252f00 100644
--- a/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/OffsetTest.kt
+++ b/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/OffsetTest.kt
@@ -108,12 +108,12 @@
     }
 
     @Test
-    fun testUseOrElseTrue() {
-        assertTrue(Offset(1f, 1f).useOrElse { Offset.Unspecified }.isSpecified)
+    fun testTakeOrElseTrue() {
+        assertTrue(Offset(1f, 1f).takeOrElse { Offset.Unspecified }.isSpecified)
     }
 
     @Test
-    fun testUseOrElseFalse() {
-        assertTrue(Offset.Unspecified.useOrElse { Offset(1f, 1f) }.isSpecified)
+    fun testTakeOrElseFalse() {
+        assertTrue(Offset.Unspecified.takeOrElse { Offset(1f, 1f) }.isSpecified)
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/SizeTest.kt b/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/SizeTest.kt
index 79417f8..ada612e 100644
--- a/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/SizeTest.kt
+++ b/compose/ui/ui-geometry/src/test/kotlin/androidx/compose/ui/geometry/SizeTest.kt
@@ -153,12 +153,12 @@
     }
 
     @Test
-    fun testUseOrElseTrue() {
-        Assert.assertTrue(Size(1f, 1f).useOrElse { Size.Unspecified }.isSpecified)
+    fun testTakeOrElseTrue() {
+        Assert.assertTrue(Size(1f, 1f).takeOrElse { Size.Unspecified }.isSpecified)
     }
 
     @Test
-    fun testUseOrElseFalse() {
-        Assert.assertTrue(Size.Unspecified.useOrElse { Size(1f, 1f) }.isSpecified)
+    fun testTakeOrElseFalse() {
+        Assert.assertTrue(Size.Unspecified.takeOrElse { Size(1f, 1f) }.isSpecified)
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/api/current.txt b/compose/ui/ui-graphics/api/current.txt
index 2ec4e22..0a18e14 100644
--- a/compose/ui/ui-graphics/api/current.txt
+++ b/compose/ui/ui-graphics/api/current.txt
@@ -335,8 +335,9 @@
     method public static inline boolean isUnspecified-8_81llA(long);
     method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, @FloatRange(from=0.0, to=1.0) float fraction);
     method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
     method @ColorInt @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
-    method public static inline long useOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @Deprecated public static inline long useOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
   }
 
   public final class DegreesKt {
diff --git a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
index 2ec4e22..0a18e14 100644
--- a/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-graphics/api/public_plus_experimental_current.txt
@@ -335,8 +335,9 @@
     method public static inline boolean isUnspecified-8_81llA(long);
     method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, @FloatRange(from=0.0, to=1.0) float fraction);
     method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
     method @ColorInt @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
-    method public static inline long useOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @Deprecated public static inline long useOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
   }
 
   public final class DegreesKt {
diff --git a/compose/ui/ui-graphics/api/restricted_current.txt b/compose/ui/ui-graphics/api/restricted_current.txt
index 990c84d..5abec76 100644
--- a/compose/ui/ui-graphics/api/restricted_current.txt
+++ b/compose/ui/ui-graphics/api/restricted_current.txt
@@ -366,8 +366,9 @@
     method public static inline boolean isUnspecified-8_81llA(long);
     method @androidx.compose.runtime.Stable public static long lerp-m18UwgE(long start, long stop, @FloatRange(from=0.0, to=1.0) float fraction);
     method @androidx.compose.runtime.Stable public static float luminance-8_81llA(long);
+    method public static inline long takeOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
     method @ColorInt @androidx.compose.runtime.Stable public static int toArgb-8_81llA(long);
-    method public static inline long useOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
+    method @Deprecated public static inline long useOrElse-iYUlWp8(long, kotlin.jvm.functions.Function0<androidx.compose.ui.graphics.Color> block);
   }
 
   public final class DegreesKt {
diff --git a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
index 53249d4..d5e194c 100644
--- a/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
+++ b/compose/ui/ui-graphics/src/commonMain/kotlin/androidx/compose/ui/graphics/Color.kt
@@ -594,4 +594,11 @@
  * If this [Color] [isSpecified] then this is returned, otherwise [block] is executed and its result
  * is returned.
  */
+@Deprecated("Use takeOrElse", ReplaceWith("takeOrElse(block)"))
 inline fun Color.useOrElse(block: () -> Color): Color = if (isSpecified) this else block()
+
+/**
+ * If this [Color] [isSpecified] then this is returned, otherwise [block] is executed and its result
+ * is returned.
+ */
+inline fun Color.takeOrElse(block: () -> Color): Color = if (isSpecified) this else block()
diff --git a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt
index ab17c2b..644b2b5 100644
--- a/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt
+++ b/compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/WaitingForOnCommitCallbackTest.kt
@@ -21,10 +21,10 @@
 import androidx.compose.runtime.onCommit
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.test.ExperimentalTesting
-import androidx.compose.ui.test.TestUiDispatcher
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
@@ -118,15 +118,12 @@
     }
 
     @Test
-    fun cascadingOnCommits_suspendedWait_defaultDispatcher() = cascadingOnCommits_suspendedWait(
-        EmptyCoroutineContext
-    )
+    fun cascadingOnCommits_suspendedWait_defaultDispatcher() =
+        cascadingOnCommits_suspendedWait(EmptyCoroutineContext)
 
     @Test
-    @OptIn(ExperimentalTesting::class)
-    fun cascadingOnCommits_suspendedWait_mainDispatcher() = cascadingOnCommits_suspendedWait(
-        TestUiDispatcher.Main
-    )
+    fun cascadingOnCommits_suspendedWait_mainDispatcher() =
+        cascadingOnCommits_suspendedWait(Dispatchers.Main)
 
     @OptIn(ExperimentalTesting::class)
     fun cascadingOnCommits_suspendedWait(context: CoroutineContext) = runBlocking(context) {
@@ -182,4 +179,4 @@
             assertThat(values).containsExactly(1, 2, 3, 4, 5, 6).inOrder()
         }
     }
-}
\ No newline at end of file
+}
diff --git a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeIdlingResource.kt b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeIdlingResource.kt
index e99a0a8..df32ab2 100644
--- a/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeIdlingResource.kt
+++ b/compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/android/ComposeIdlingResource.kt
@@ -171,7 +171,9 @@
         // TODO(b/174244530): Include hadNoPendingDraw when it is reliable
 //        val hadPendingDraw = !hadNoPendingDraw
 
-        val wasIdle = !hadSnapshotChanges && !hadRecomposerChanges && !hadRunningAnimations
+        val wasIdle = !hadSnapshotChanges && !hadRecomposerChanges && !hadRunningAnimations &&
+            // TODO(b/174244530): Include hadNoPendingDraw when it is reliable
+            !hadPendingMeasureLayout /*&& !hadPendingDraw*/
 
         if (wasIdle) {
             return null
@@ -185,16 +187,16 @@
         if (busyRecomposing) {
             busyReasons.add("pending recompositions")
         }
+        if (hadPendingMeasureLayout) {
+            busyReasons.add("pending measure/layout")
+        }
 
         var message = "${javaClass.simpleName} is busy due to ${busyReasons.joinToString(", ")}.\n"
         if (busyRecomposing) {
             message += "- Note: Timeout on pending recomposition means that there are most likely" +
                 " infinite re-compositions happening in the tested code.\n"
             message += "- Debug: hadRecomposerChanges = $hadRecomposerChanges, "
-            message += "hadSnapshotChanges = $hadSnapshotChanges, "
-            message += "hadPendingMeasureLayout = $hadPendingMeasureLayout"
-            // TODO(b/174244530): Include hadNoPendingDraw when it is reliable
-//            message += ", hadPendingDraw = $hadPendingDraw"
+            message += "hadSnapshotChanges = $hadSnapshotChanges"
         }
         return message
     }
diff --git a/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistry.kt b/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistry.kt
index 5afcb3c..6ffd62e 100644
--- a/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistry.kt
+++ b/compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/IdlingResourceRegistry.kt
@@ -140,8 +140,8 @@
                 )
             }
         return "IdlingResourceRegistry has the following idling resources registered:" +
-            busy.map { "\n- [busy] ${it.indentBy("         ")}" } +
-            idle.map { "\n- [idle] $it" } +
+            busy.joinToString { "\n- [busy] ${it.indentBy("         ")}" } +
+            idle.joinToString { "\n- [idle] $it" } +
             if (idle.isEmpty() && busy.isEmpty()) "\n<none>" else ""
     }
 
diff --git a/compose/ui/ui-test/api/current.txt b/compose/ui/ui-test/api/current.txt
index 6a6fa69..d88b6ad 100644
--- a/compose/ui/ui-test/api/current.txt
+++ b/compose/ui/ui-test/api/current.txt
@@ -307,8 +307,8 @@
   }
 
   @androidx.compose.ui.test.ExperimentalTesting public final class TestUiDispatcher {
-    method public kotlin.coroutines.CoroutineContext getMain();
-    property public final kotlin.coroutines.CoroutineContext Main;
+    method @Deprecated public kotlin.coroutines.CoroutineContext getMain();
+    property @Deprecated public final kotlin.coroutines.CoroutineContext Main;
     field public static final androidx.compose.ui.test.TestUiDispatcher INSTANCE;
   }
 
diff --git a/compose/ui/ui-test/api/public_plus_experimental_current.txt b/compose/ui/ui-test/api/public_plus_experimental_current.txt
index 6a6fa69..d88b6ad 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -307,8 +307,8 @@
   }
 
   @androidx.compose.ui.test.ExperimentalTesting public final class TestUiDispatcher {
-    method public kotlin.coroutines.CoroutineContext getMain();
-    property public final kotlin.coroutines.CoroutineContext Main;
+    method @Deprecated public kotlin.coroutines.CoroutineContext getMain();
+    property @Deprecated public final kotlin.coroutines.CoroutineContext Main;
     field public static final androidx.compose.ui.test.TestUiDispatcher INSTANCE;
   }
 
diff --git a/compose/ui/ui-test/api/restricted_current.txt b/compose/ui/ui-test/api/restricted_current.txt
index 6a6fa69..d88b6ad 100644
--- a/compose/ui/ui-test/api/restricted_current.txt
+++ b/compose/ui/ui-test/api/restricted_current.txt
@@ -307,8 +307,8 @@
   }
 
   @androidx.compose.ui.test.ExperimentalTesting public final class TestUiDispatcher {
-    method public kotlin.coroutines.CoroutineContext getMain();
-    property public final kotlin.coroutines.CoroutineContext Main;
+    method @Deprecated public kotlin.coroutines.CoroutineContext getMain();
+    property @Deprecated public final kotlin.coroutines.CoroutineContext Main;
     field public static final androidx.compose.ui.test.TestUiDispatcher INSTANCE;
   }
 
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/CoroutineBuilders.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/CoroutineBuilders.kt
index 4a03271..4626cb2 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/CoroutineBuilders.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/CoroutineBuilders.kt
@@ -20,6 +20,7 @@
 import androidx.compose.animation.core.MonotonicFrameAnimationClock
 import androidx.compose.animation.core.advanceClockMillis
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.yield
 
@@ -29,7 +30,7 @@
  * [runBlocking] if they want to use a [ManualFrameClock].
  *
  * The clock will start at time 0L and should be driven manually from your test, from the
- * [main dispatcher][TestUiDispatcher.Main]. Pass the clock to the animation that you want to
+ * [main dispatcher][Dispatchers.Main]. Pass the clock to the animation that you want to
  * control in your test, and then [advance][advanceClockMillis] it as necessary. After the block
  * has completed, the clock will be forwarded with 10 second increments until it has drained all
  * work that took frames from that clock. If the work never ends, this function never ends, so
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestUiDispatcher.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestUiDispatcher.kt
index 52e2efe..2c0c3cd 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestUiDispatcher.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TestUiDispatcher.kt
@@ -16,16 +16,17 @@
 
 package androidx.compose.ui.test
 
-import androidx.compose.runtime.EmbeddingContext
+import kotlinx.coroutines.Dispatchers
 import kotlin.coroutines.CoroutineContext
 
-// Experimental because it isn't yet clear if the behavior on Robolectric is correct
 @ExperimentalTesting
 object TestUiDispatcher {
     /**
      * The dispatcher to use if you need to dispatch coroutines on the main thread in tests.
      */
-    val Main: CoroutineContext by lazy {
-        EmbeddingContext().mainThreadCompositionContext()
-    }
+    @Deprecated(
+        message = "Removed in favor of Dispatchers.Main",
+        replaceWith = ReplaceWith("Dispatchers.Main", "kotlinx.coroutines.Dispatchers")
+    )
+    val Main: CoroutineContext = Dispatchers.Main
 }
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 19bd344..8830895 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
@@ -21,7 +21,7 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shadow
 import androidx.compose.ui.graphics.lerp
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontSynthesis
@@ -99,7 +99,7 @@
         if (other == null) return this
 
         return SpanStyle(
-            color = other.color.useOrElse { this.color },
+            color = other.color.takeOrElse { this.color },
             fontFamily = other.fontFamily ?: this.fontFamily,
             fontSize = if (!other.fontSize.isUnspecified) other.fontSize else this.fontSize,
             fontWeight = other.fontWeight ?: this.fontWeight,
@@ -114,7 +114,7 @@
             baselineShift = other.baselineShift ?: this.baselineShift,
             textGeometricTransform = other.textGeometricTransform ?: this.textGeometricTransform,
             localeList = other.localeList ?: this.localeList,
-            background = other.background.useOrElse { this.background },
+            background = other.background.takeOrElse { this.background },
             textDecoration = other.textDecoration ?: this.textDecoration,
             shadow = other.shadow ?: this.shadow
         )
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 2da7175..e9806458 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
@@ -20,7 +20,7 @@
 import androidx.compose.runtime.Stable
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shadow
-import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.graphics.takeOrElse
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontSynthesis
@@ -258,7 +258,7 @@
  * @return resolved text style.
  */
 fun resolveDefaults(style: TextStyle, direction: LayoutDirection) = TextStyle(
-    color = style.color.useOrElse { DefaultColor },
+    color = style.color.takeOrElse { DefaultColor },
     fontSize = if (style.fontSize.isUnspecified) DefaultFontSize else style.fontSize,
     fontWeight = style.fontWeight ?: FontWeight.Normal,
     fontStyle = style.fontStyle ?: FontStyle.Normal,
@@ -273,7 +273,7 @@
     baselineShift = style.baselineShift ?: BaselineShift.None,
     textGeometricTransform = style.textGeometricTransform ?: TextGeometricTransform.None,
     localeList = style.localeList ?: LocaleList.current,
-    background = style.background.useOrElse { DefaultBackgroundColor },
+    background = style.background.takeOrElse { DefaultBackgroundColor },
     textDecoration = style.textDecoration ?: TextDecoration.None,
     shadow = style.shadow ?: Shadow.None,
     textAlign = style.textAlign ?: TextAlign.Start,
diff --git a/compose/ui/ui-unit/api/current.txt b/compose/ui/ui-unit/api/current.txt
index 0fc7115..1a4ba07 100644
--- a/compose/ui/ui-unit/api/current.txt
+++ b/compose/ui/ui-unit/api/current.txt
@@ -57,9 +57,10 @@
     method @androidx.compose.runtime.Stable public static long enforce-WVSBfsc(long, long otherConstraints);
     method public static boolean getHasFixedHeight-BRTryo0(long);
     method public static boolean getHasFixedWidth-BRTryo0(long);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
     method public static boolean isZero-BRTryo0(long);
     method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(long, optional int horizontal, optional int vertical);
-    method @androidx.compose.runtime.Stable public static boolean satisfiedBy-m9CmiCs(long, long size);
+    method @Deprecated @androidx.compose.runtime.Stable public static boolean satisfiedBy-m9CmiCs(long, long size);
   }
 
   @androidx.compose.runtime.Immutable public interface Density {
@@ -92,17 +93,14 @@
     method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
     method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
     method public static boolean equals-impl0(float p1, float p2);
     method public float getValue();
     method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
     method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-_kMlNio(float $this, float other);
     method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
     method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
     property public final float value;
@@ -118,92 +116,28 @@
     property public final float Unspecified;
   }
 
-  @androidx.compose.runtime.Immutable public final inline class DpCubed implements java.lang.Comparable<androidx.compose.ui.unit.DpCubed> {
-    ctor public DpCubed();
-    method @androidx.compose.runtime.Stable public operator int compareTo-MZZJ3Fw(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-MZZJ3Fw(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-5FSHFdU(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-MZZJ3Fw(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-MZZJ3Fw(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float times-5FSHFdU(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
-  }
-
-  @androidx.compose.runtime.Immutable public final inline class DpInverse implements java.lang.Comparable<androidx.compose.ui.unit.DpInverse> {
-    ctor public DpInverse();
-    method @androidx.compose.runtime.Stable public operator int compareTo-NdYQkfI(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-NdYQkfI(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-PAM_5xQ(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-NdYQkfI(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-NdYQkfI(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-PAM_5xQ(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
-  }
-
   public final class DpKt {
     method @androidx.compose.runtime.Stable public static inline long Position-ioHfwGI(float x, float y);
     method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
     method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
     method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
-    method @androidx.compose.runtime.Stable public static inline operator float div-Cp9Wa6o(int, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-NSq4UQk(double, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-NnR5yEA(float, float other);
     method @androidx.compose.runtime.Stable public static float getDistance-IsWn59c(long);
     method public static inline float getDp(int);
     method public static inline float getDp(double);
     method public static inline float getDp(float);
     method public static inline float getHeight(androidx.compose.ui.unit.Bounds);
     method public static inline float getWidth(androidx.compose.ui.unit.Bounds);
-    method @androidx.compose.runtime.Stable public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isFinite-0680j_4(float);
     method public static inline boolean isSpecified-0680j_4(float);
     method public static inline boolean isUnspecified-0680j_4(float);
     method @androidx.compose.runtime.Stable public static long lerp-2vlZtig(long start, long stop, float fraction);
     method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
     method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
     method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
     method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
-    method public static inline float useOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
-  }
-
-  @androidx.compose.runtime.Immutable public final inline class DpSquared implements java.lang.Comparable<androidx.compose.ui.unit.DpSquared> {
-    ctor public DpSquared();
-    method @androidx.compose.runtime.Stable public operator int compareTo-_kMlNio(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-_kMlNio(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-ym20N70(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-ym20N70(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Duration implements java.lang.Comparable<androidx.compose.ui.unit.Duration> {
@@ -496,10 +430,10 @@
     method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long a, long b, float t);
     method @androidx.compose.runtime.Stable public static inline long max-8E83U4Q(long a, long b);
     method @androidx.compose.runtime.Stable public static inline long min-8E83U4Q(long a, long b);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
     method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
     method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
     method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
-    method public static inline long useOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
   }
 
   public enum TextUnitType {
@@ -539,7 +473,7 @@
     method public static inline boolean isSpecified-fQUwLeo(long);
     method public static inline boolean isUnspecified-fQUwLeo(long);
     method public static operator long plus-I3RPvYE(long, long uptime);
-    method public static inline long useOrElse-N-58ELw(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Uptime> block);
+    method public static inline long takeOrElse-N-58ELw(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Uptime> block);
   }
 
   @androidx.compose.runtime.Immutable public final inline class Velocity {
diff --git a/compose/ui/ui-unit/api/public_plus_experimental_current.txt b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
index 0fc7115..1a4ba07 100644
--- a/compose/ui/ui-unit/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-unit/api/public_plus_experimental_current.txt
@@ -57,9 +57,10 @@
     method @androidx.compose.runtime.Stable public static long enforce-WVSBfsc(long, long otherConstraints);
     method public static boolean getHasFixedHeight-BRTryo0(long);
     method public static boolean getHasFixedWidth-BRTryo0(long);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
     method public static boolean isZero-BRTryo0(long);
     method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(long, optional int horizontal, optional int vertical);
-    method @androidx.compose.runtime.Stable public static boolean satisfiedBy-m9CmiCs(long, long size);
+    method @Deprecated @androidx.compose.runtime.Stable public static boolean satisfiedBy-m9CmiCs(long, long size);
   }
 
   @androidx.compose.runtime.Immutable public interface Density {
@@ -92,17 +93,14 @@
     method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
     method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
     method public static boolean equals-impl0(float p1, float p2);
     method public float getValue();
     method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
     method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-_kMlNio(float $this, float other);
     method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
     method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
     property public final float value;
@@ -118,92 +116,28 @@
     property public final float Unspecified;
   }
 
-  @androidx.compose.runtime.Immutable public final inline class DpCubed implements java.lang.Comparable<androidx.compose.ui.unit.DpCubed> {
-    ctor public DpCubed();
-    method @androidx.compose.runtime.Stable public operator int compareTo-MZZJ3Fw(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-MZZJ3Fw(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-5FSHFdU(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-MZZJ3Fw(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-MZZJ3Fw(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float times-5FSHFdU(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
-  }
-
-  @androidx.compose.runtime.Immutable public final inline class DpInverse implements java.lang.Comparable<androidx.compose.ui.unit.DpInverse> {
-    ctor public DpInverse();
-    method @androidx.compose.runtime.Stable public operator int compareTo-NdYQkfI(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-NdYQkfI(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-PAM_5xQ(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-NdYQkfI(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-NdYQkfI(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-PAM_5xQ(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
-  }
-
   public final class DpKt {
     method @androidx.compose.runtime.Stable public static inline long Position-ioHfwGI(float x, float y);
     method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
     method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
     method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
-    method @androidx.compose.runtime.Stable public static inline operator float div-Cp9Wa6o(int, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-NSq4UQk(double, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-NnR5yEA(float, float other);
     method @androidx.compose.runtime.Stable public static float getDistance-IsWn59c(long);
     method public static inline float getDp(int);
     method public static inline float getDp(double);
     method public static inline float getDp(float);
     method public static inline float getHeight(androidx.compose.ui.unit.Bounds);
     method public static inline float getWidth(androidx.compose.ui.unit.Bounds);
-    method @androidx.compose.runtime.Stable public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isFinite-0680j_4(float);
     method public static inline boolean isSpecified-0680j_4(float);
     method public static inline boolean isUnspecified-0680j_4(float);
     method @androidx.compose.runtime.Stable public static long lerp-2vlZtig(long start, long stop, float fraction);
     method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
     method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
     method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
     method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
-    method public static inline float useOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
-  }
-
-  @androidx.compose.runtime.Immutable public final inline class DpSquared implements java.lang.Comparable<androidx.compose.ui.unit.DpSquared> {
-    ctor public DpSquared();
-    method @androidx.compose.runtime.Stable public operator int compareTo-_kMlNio(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-_kMlNio(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-ym20N70(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-ym20N70(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Duration implements java.lang.Comparable<androidx.compose.ui.unit.Duration> {
@@ -496,10 +430,10 @@
     method @androidx.compose.runtime.Stable public static long lerp-KeuwX78(long a, long b, float t);
     method @androidx.compose.runtime.Stable public static inline long max-8E83U4Q(long a, long b);
     method @androidx.compose.runtime.Stable public static inline long min-8E83U4Q(long a, long b);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
     method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
     method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
     method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
-    method public static inline long useOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
   }
 
   public enum TextUnitType {
@@ -539,7 +473,7 @@
     method public static inline boolean isSpecified-fQUwLeo(long);
     method public static inline boolean isUnspecified-fQUwLeo(long);
     method public static operator long plus-I3RPvYE(long, long uptime);
-    method public static inline long useOrElse-N-58ELw(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Uptime> block);
+    method public static inline long takeOrElse-N-58ELw(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Uptime> block);
   }
 
   @androidx.compose.runtime.Immutable public final inline class Velocity {
diff --git a/compose/ui/ui-unit/api/restricted_current.txt b/compose/ui/ui-unit/api/restricted_current.txt
index f159489..79c6020 100644
--- a/compose/ui/ui-unit/api/restricted_current.txt
+++ b/compose/ui/ui-unit/api/restricted_current.txt
@@ -57,9 +57,10 @@
     method @androidx.compose.runtime.Stable public static long enforce-WVSBfsc(long, long otherConstraints);
     method public static boolean getHasFixedHeight-BRTryo0(long);
     method public static boolean getHasFixedWidth-BRTryo0(long);
+    method @androidx.compose.runtime.Stable public static boolean isSatisfiedBy-m9CmiCs(long, long size);
     method public static boolean isZero-BRTryo0(long);
     method @androidx.compose.runtime.Stable public static long offset-dAqVMF8(long, optional int horizontal, optional int vertical);
-    method @androidx.compose.runtime.Stable public static boolean satisfiedBy-m9CmiCs(long, long size);
+    method @Deprecated @androidx.compose.runtime.Stable public static boolean satisfiedBy-m9CmiCs(long, long size);
   }
 
   @androidx.compose.runtime.Immutable public interface Density {
@@ -92,17 +93,14 @@
     method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float div-D9Ej5fM(float $this, int other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
     method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
     method public static boolean equals-impl0(float p1, float p2);
     method public float getValue();
     method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
     method @androidx.compose.runtime.Stable public static inline operator float minus-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float plus-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-D9Ej5fM(float $this, int other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-_kMlNio(float $this, float other);
     method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
     method @androidx.compose.runtime.Stable public static inline operator float unaryMinus-D9Ej5fM(float $this);
     property public final float value;
@@ -118,92 +116,28 @@
     property public final float Unspecified;
   }
 
-  @androidx.compose.runtime.Immutable public final inline class DpCubed implements java.lang.Comparable<androidx.compose.ui.unit.DpCubed> {
-    ctor public DpCubed();
-    method @androidx.compose.runtime.Stable public operator int compareTo-MZZJ3Fw(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-MZZJ3Fw(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-5FSHFdU(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-MZZJ3Fw(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-MZZJ3Fw(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float times-5FSHFdU(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
-  }
-
-  @androidx.compose.runtime.Immutable public final inline class DpInverse implements java.lang.Comparable<androidx.compose.ui.unit.DpInverse> {
-    ctor public DpInverse();
-    method @androidx.compose.runtime.Stable public operator int compareTo-NdYQkfI(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-NdYQkfI(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-PAM_5xQ(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-NdYQkfI(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-NdYQkfI(float $this, float dimension);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-PAM_5xQ(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
-  }
-
   public final class DpKt {
     method @androidx.compose.runtime.Stable public static inline long Position-ioHfwGI(float x, float y);
     method @androidx.compose.runtime.Stable public static inline float coerceAtLeast-ioHfwGI(float, float minimumValue);
     method @androidx.compose.runtime.Stable public static inline float coerceAtMost-ioHfwGI(float, float maximumValue);
     method @androidx.compose.runtime.Stable public static inline float coerceIn-qYQSm_w(float, float minimumValue, float maximumValue);
-    method @androidx.compose.runtime.Stable public static inline operator float div-Cp9Wa6o(int, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-NSq4UQk(double, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-NnR5yEA(float, float other);
     method @androidx.compose.runtime.Stable public static float getDistance-IsWn59c(long);
     method public static inline float getDp(int);
     method public static inline float getDp(double);
     method public static inline float getDp(float);
     method public static inline float getHeight(androidx.compose.ui.unit.Bounds);
     method public static inline float getWidth(androidx.compose.ui.unit.Bounds);
-    method @androidx.compose.runtime.Stable public static inline boolean isFinite-0680j_4(float);
+    method public static inline boolean isFinite-0680j_4(float);
     method public static inline boolean isSpecified-0680j_4(float);
     method public static inline boolean isUnspecified-0680j_4(float);
     method @androidx.compose.runtime.Stable public static long lerp-2vlZtig(long start, long stop, float fraction);
     method @androidx.compose.runtime.Stable public static float lerp-7oHWEOI(float start, float stop, float fraction);
     method @androidx.compose.runtime.Stable public static inline float max-ioHfwGI(float a, float b);
     method @androidx.compose.runtime.Stable public static inline float min-ioHfwGI(float a, float b);
+    method public static inline float takeOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
     method @androidx.compose.runtime.Stable public static inline operator float times-Cp9Wa6o(int, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-NSq4UQk(double, float other);
     method @androidx.compose.runtime.Stable public static inline operator float times-NnR5yEA(float, float other);
-    method public static inline float useOrElse-RiydCdY(float, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Dp> block);
-  }
-
-  @androidx.compose.runtime.Immutable public final inline class DpSquared implements java.lang.Comparable<androidx.compose.ui.unit.DpSquared> {
-    ctor public DpSquared();
-    method @androidx.compose.runtime.Stable public operator int compareTo-_kMlNio(float p);
-    method @androidx.compose.runtime.Stable public static operator int compareTo-_kMlNio(float $this, float other);
-    method public static float constructor-impl(float value);
-    method @androidx.compose.runtime.Stable public static inline operator float div-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-MZZJ3Fw(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float div-ym20N70(float $this, float other);
-    method @androidx.compose.runtime.Immutable public static inline boolean equals-impl(float p, Object? p1);
-    method public static boolean equals-impl0(float p1, float p2);
-    method public float getValue();
-    method @androidx.compose.runtime.Immutable public static inline int hashCode-impl(float p);
-    method @androidx.compose.runtime.Stable public static inline operator float minus-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float plus-_kMlNio(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-0680j_4(float $this, float other);
-    method @androidx.compose.runtime.Stable public static inline operator float times-ym20N70(float $this, float other);
-    method @androidx.compose.runtime.Stable public static String toString-impl(float $this);
-    property public final float value;
   }
 
   @androidx.compose.runtime.Immutable public final inline class Duration implements java.lang.Comparable<androidx.compose.ui.unit.Duration> {
@@ -500,10 +434,10 @@
     method @androidx.compose.runtime.Stable public static inline long max-8E83U4Q(long a, long b);
     method @androidx.compose.runtime.Stable public static inline long min-8E83U4Q(long a, long b);
     method @kotlin.PublishedApi internal static inline long pack(long unitType, float v);
+    method public static inline long takeOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
     method @androidx.compose.runtime.Stable public static inline operator long times-0PRCd3Q(double, long other);
     method @androidx.compose.runtime.Stable public static inline operator long times-Ew26DjI(float, long other);
     method @androidx.compose.runtime.Stable public static inline operator long times-VJWtCv4(int, long other);
-    method public static inline long useOrElse-bAewZlA(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.TextUnit> block);
   }
 
   public enum TextUnitType {
@@ -543,7 +477,7 @@
     method public static inline boolean isSpecified-fQUwLeo(long);
     method public static inline boolean isUnspecified-fQUwLeo(long);
     method public static operator long plus-I3RPvYE(long, long uptime);
-    method public static inline long useOrElse-N-58ELw(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Uptime> block);
+    method public static inline long takeOrElse-N-58ELw(long, kotlin.jvm.functions.Function0<androidx.compose.ui.unit.Uptime> block);
   }
 
   @androidx.compose.runtime.Immutable public final inline class Velocity {
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt
index e2b4738..5df0371 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Constraints.kt
@@ -476,6 +476,15 @@
  * Takes a size and returns whether it satisfies the current constraints.
  */
 @Stable
+fun Constraints.isSatisfiedBy(size: IntSize): Boolean {
+    return size.width in minWidth..maxWidth && size.height in minHeight..maxHeight
+}
+
+@Deprecated(
+    "satisfiedBy was renamed to isSatisfiedBy.",
+    ReplaceWith("isSatifiedBy(size)", "androidx.compose.ui.unit.isSatisfiedBy")
+)
+@Stable
 fun Constraints.satisfiedBy(size: IntSize): Boolean {
     return size.width in minWidth..maxWidth && size.height in minHeight..maxHeight
 }
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt
index cc41b9e..bb24b51 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Dp.kt
@@ -83,13 +83,6 @@
     inline operator fun div(other: Dp): Float = value / other.value
 
     /**
-     * Divide by [DpSquared] to get a [DpInverse].
-     */
-    @Stable
-    inline operator fun div(other: DpSquared): DpInverse =
-        DpInverse(value = value / other.value)
-
-    /**
      * Multiply a Dp by a scalar.
      */
     @Stable
@@ -101,20 +94,6 @@
         Dp(value = value * other)
 
     /**
-     * Multiply by a Dp to get a [DpSquared] result.
-     */
-    @Stable
-    inline operator fun times(other: Dp): DpSquared =
-        DpSquared(value = value * other.value)
-
-    /**
-     * Multiply by a Dp to get a [DpSquared] result.
-     */
-    @Stable
-    inline operator fun times(other: DpSquared): DpCubed =
-        DpCubed(value = value * other.value)
-
-    /**
      * Support comparing Dimensions with comparison operators.
      */
     @Stable
@@ -163,7 +142,7 @@
  * If this [Dp] [isSpecified] then this is returned, otherwise [block] is executed
  * and its result is returned.
  */
-inline fun Dp.useOrElse(block: () -> Dp): Dp =
+inline fun Dp.takeOrElse(block: () -> Dp): Dp =
     if (isSpecified) this else block()
 
 /**
@@ -197,18 +176,6 @@
 inline val Float.dp: Dp get() = Dp(value = this)
 
 @Stable
-inline operator fun Float.div(other: Dp) =
-    DpInverse(this / other.value)
-
-@Stable
-inline operator fun Double.div(other: Dp) =
-    DpInverse(this.toFloat() / other.value)
-
-@Stable
-inline operator fun Int.div(other: Dp) =
-    DpInverse(this / other.value)
-
-@Stable
 inline operator fun Float.times(other: Dp) =
     Dp(this * other.value)
 
@@ -260,7 +227,7 @@
  * Return `true` when it is finite or `false` when it is [Dp.Infinity]
  */
 @Stable
-inline fun Dp.isFinite(): Boolean = value != Float.POSITIVE_INFINITY
+inline val Dp.isFinite: Boolean get() = value != Float.POSITIVE_INFINITY
 
 /**
  * Linearly interpolate between two [Dp]s.
@@ -278,226 +245,6 @@
     return Dp(lerp(start.value, stop.value, fraction))
 }
 
-/**
- * Holds a unit of squared dimensions, such as `1.value * 2.dp`. [DpSquared], [DpCubed],
- * and [DpInverse] are used primarily for [Dp] calculations to ensure resulting
- * units are as expected. Many times, [Dp] calculations use scalars to determine the final
- * dimension during calculation:
- *     val width = oldWidth * stretchAmount
- * Other times, it is useful to do intermediate calculations with Dimensions directly:
- *     val width = oldWidth * newTotalWidth / oldTotalWidth
- */
-@Suppress("EXPERIMENTAL_FEATURE_WARNING")
-@Immutable
-inline class DpSquared(val value: Float) : Comparable<DpSquared> {
-    /**
-     * Add two DimensionSquares together.
-     */
-    @Stable
-    inline operator fun plus(other: DpSquared) =
-        DpSquared(value = value + other.value)
-
-    /**
-     * Subtract a DimensionSquare from another one.
-     */
-    @Stable
-    inline operator fun minus(other: DpSquared) =
-        DpSquared(value = value - other.value)
-
-    /**
-     * Divide a DimensionSquare by a scalar.
-     */
-    @Stable
-    inline operator fun div(other: Float): DpSquared =
-        DpSquared(value = value / other)
-
-    /**
-     * Divide by a [Dp] to get a [Dp] result.
-     */
-    @Stable
-    inline operator fun div(other: Dp): Dp =
-        Dp(value = value / other.value)
-
-    /**
-     * Divide by a DpSquared to get a scalar result.
-     */
-    @Stable
-    inline operator fun div(other: DpSquared): Float = value / other.value
-
-    /**
-     * Divide by a [DpCubed] to get a [DpInverse] result.
-     */
-    @Stable
-    inline operator fun div(other: DpCubed): DpInverse =
-        DpInverse(value / other.value)
-
-    /**
-     * Multiply by a scalar to get a DpSquared result.
-     */
-    @Stable
-    inline operator fun times(other: Float): DpSquared =
-        DpSquared(value = value * other)
-
-    /**
-     * Multiply by a scalar to get a DpSquared result.
-     */
-    @Stable
-    inline operator fun times(other: Dp): DpCubed =
-        DpCubed(value = value * other.value)
-
-    /**
-     * Support comparing DpSquared with comparison operators.
-     */
-    @Stable
-    override /* TODO: inline */ operator fun compareTo(other: DpSquared) =
-        value.compareTo(other.value)
-
-    @Stable
-    override fun toString(): String = "$value.dp^2"
-}
-
-/**
- * Holds a unit of cubed dimensions, such as `1.value * 2.value * 3.dp`. [DpSquared],
- * [DpCubed], and [DpInverse] are used primarily for [Dp] calculations to
- * ensure resulting units are as expected. Many times, [Dp] calculations use scalars to
- * determine the final dimension during calculation:
- *     val width = oldWidth * stretchAmount
- * Other times, it is useful to do intermediate calculations with Dimensions directly:
- *     val width = oldWidth * newTotalWidth / oldTotalWidth
- */
-@Suppress("EXPERIMENTAL_FEATURE_WARNING")
-@Immutable
-inline class DpCubed(val value: Float) : Comparable<DpCubed> {
-
-    /**
-     * Add two DpCubed together.
-     */
-    @Stable
-    inline operator fun plus(dimension: DpCubed) =
-        DpCubed(value = value + dimension.value)
-
-    /**
-     * Subtract a DpCubed from another one.
-     */
-    @Stable
-    inline operator fun minus(dimension: DpCubed) =
-        DpCubed(value = value - dimension.value)
-
-    /**
-     * Divide a DpCubed by a scalar.
-     */
-    @Stable
-    inline operator fun div(other: Float): DpCubed =
-        DpCubed(value = value / other)
-
-    /**
-     * Divide by a [Dp] to get a [DpSquared] result.
-     */
-    @Stable
-    inline operator fun div(other: Dp): DpSquared =
-        DpSquared(value = value / other.value)
-
-    /**
-     * Divide by a [DpSquared] to get a [Dp] result.
-     */
-    @Stable
-    inline operator fun div(other: DpSquared): Dp =
-        Dp(value = value / other.value)
-
-    /**
-     * Divide by a DpCubed to get a scalar result.
-     */
-    @Stable
-    inline operator fun div(other: DpCubed): Float = value / other.value
-
-    /**
-     * Multiply by a scalar to get a DpCubed result.
-     */
-    @Stable
-    inline operator fun times(other: Float): DpCubed =
-        DpCubed(value = value * other)
-
-    /**
-     * Support comparing DpCubed with comparison operators.
-     */
-    @Stable
-    override /* TODO: inline */ operator fun compareTo(other: DpCubed) =
-        value.compareTo(other.value)
-
-    @Stable
-    override fun toString(): String = "$value.dp^3"
-}
-/**
- * Holds a unit of an inverse dimensions, such as `1.dp / (2.value * 3.dp)`. [DpSquared],
- * [DpCubed], and [DpInverse] are used primarily for [Dp] calculations to
- * ensure resulting units are as expected. Many times, [Dp] calculations use scalars to
- * determine the final dimension during calculation:
- *     val width = oldWidth * stretchAmount
- * Other times, it is useful to do intermediate calculations with Dimensions directly:
- *     val width = oldWidth * newTotalWidth / oldTotalWidth
- */
-@Suppress("EXPERIMENTAL_FEATURE_WARNING")
-@Immutable
-inline class DpInverse(val value: Float) : Comparable<DpInverse> {
-    /**
-     * Add two DpInverse together.
-     */
-    @Stable
-    inline operator fun plus(dimension: DpInverse) =
-        DpInverse(value = value + dimension.value)
-
-    /**
-     * Subtract a DpInverse from another one.
-     */
-    @Stable
-    inline operator fun minus(dimension: DpInverse) =
-        DpInverse(value = value - dimension.value)
-
-    /**
-     * Divide a DpInverse by a scalar.
-     */
-    @Stable
-    inline operator fun div(other: Float): DpInverse =
-        DpInverse(value = value / other)
-
-    /**
-     * Multiply by a scalar to get a DpInverse result.
-     */
-    @Stable
-    inline operator fun times(other: Float): DpInverse =
-        DpInverse(value = value * other)
-
-    /**
-     * Multiply by a [Dp] to get a scalar result.
-     */
-    @Stable
-    inline operator fun times(other: Dp): Float = value * other.value
-
-    /**
-     * Multiply by a [DpSquared] to get a [Dp] result.
-     */
-    @Stable
-    inline operator fun times(other: DpSquared): Dp =
-        Dp(value = value * other.value)
-
-    /**
-     * Multiply by a [DpCubed] to get a [DpSquared] result.
-     */
-    @Stable
-    inline operator fun times(other: DpCubed): DpSquared =
-        DpSquared(value = value * other.value)
-
-    /**
-     * Support comparing DpInverse with comparison operators.
-     */
-    @Stable
-    override /* TODO: inline */ operator fun compareTo(other: DpInverse) =
-        value.compareTo(other.value)
-
-    @Stable
-    override fun toString(): String = "$value.dp^-1"
-}
-
 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 // Structures using Dp
 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
index 8d9a508..5e819bc 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/TextUnit.kt
@@ -304,7 +304,7 @@
  * If this [TextUnit] [isSpecified] then this is returned, otherwise [block] is executed
  * and its result is returned.
  */
-inline fun TextUnit.useOrElse(block: () -> TextUnit): TextUnit =
+inline fun TextUnit.takeOrElse(block: () -> TextUnit): TextUnit =
     if (isSpecified) this else block()
 
 /**
diff --git a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Uptime.kt b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Uptime.kt
index d75a4bc..b015313 100644
--- a/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Uptime.kt
+++ b/compose/ui/ui-unit/src/commonMain/kotlin/androidx/compose/ui/unit/Uptime.kt
@@ -86,7 +86,7 @@
  * If this [Uptime] [isSpecified] then this is returned, otherwise [block] is executed
  * and its result is returned.
  */
-inline fun Uptime.useOrElse(block: () -> Uptime): Uptime =
+inline fun Uptime.takeOrElse(block: () -> Uptime): Uptime =
     if (isSpecified) this else block()
 
 /**
diff --git a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/DpTest.kt b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/DpTest.kt
index 5dc89e3..519afcb 100644
--- a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/DpTest.kt
+++ b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/DpTest.kt
@@ -83,39 +83,17 @@
     }
 
     @Test
-    fun multiplyDimension() {
-        assertEquals(DpSquared(40f), 10.dp * 4.dp)
-    }
-
-    @Test
-    fun multiplyDimensionSquared() {
-        assertEquals(DpCubed(40f), 10.dp * (2.dp * 2.dp))
-    }
-
-    @Test
     fun divideOperator() {
         assertEquals(10f, 100.dp / 10f.dp, 0f)
         assertEquals(0f, 0.dp / 10f.dp, 0f)
     }
 
     @Test
-    fun divideOperatorInverse() {
-        assertEquals(DpInverse(10f), 100f / 10.dp)
-        assertEquals(DpInverse(10f), 100.0 / 10.dp)
-        assertEquals(DpInverse(10f), 100 / 10.dp)
-    }
-
-    @Test
     fun divideToScalar() {
         assertEquals(1f, 1.dp / 1.dp, 0f)
     }
 
     @Test
-    fun divideToInverse() {
-        assertEquals(DpInverse(10f), 100.dp / (5.dp * 2.dp))
-    }
-
-    @Test
     fun hairline() {
         assertEquals(0f, Dp.Hairline.value, 0f)
     }
@@ -143,140 +121,6 @@
     }
 
     @Test
-    fun addDimension2() {
-        assertEquals(DpSquared(4f), (2.dp * 1.dp) + (1.dp * 2.dp))
-    }
-
-    @Test
-    fun subtractDimension2() {
-        assertEquals(DpSquared(0f), (2.dp * 3.dp) - (3.dp * 2.dp))
-    }
-
-    @Test
-    fun divideDimension2() {
-        assertEquals(DpSquared(1f), (2.dp * 5.dp) / 10f)
-    }
-
-    @Test
-    fun divideDimension2Dimension() {
-        assertEquals(1f, ((2.dp * 2.dp) / 4.dp).value, 0f)
-    }
-
-    @Test
-    fun divideDimension2Dimension2() {
-        assertEquals(1f, (2.dp * 2.dp) / (2.dp * 2.dp))
-    }
-
-    @Test
-    fun divideDimension2Dimension3() {
-        assertEquals(DpInverse(0.5f), (2.dp * 2.dp) / (2.dp * 2.dp * 2.dp))
-    }
-
-    @Test
-    fun multiplyDimension2() {
-        assertEquals(DpSquared(4f), (2.dp * 1.dp) * 2f)
-    }
-
-    @Test
-    fun multiplyDimension2Dimension() {
-        assertEquals(DpCubed(4f), (2.dp * 1.dp) * 2.dp)
-    }
-
-    @Test
-    fun compareDimension2() {
-        assertTrue(DpSquared(0f) < DpSquared(Float.MIN_VALUE))
-        assertTrue(DpSquared(1f) < DpSquared(3f))
-        assertTrue(DpSquared(1f) == DpSquared(1f))
-        assertTrue(DpSquared(1f) > DpSquared(0f))
-    }
-
-    @Test
-    fun addDimension3() {
-        assertEquals(DpCubed(4f), (2.dp * 1.dp * 1.dp) + (1.dp * 2.dp * 1.dp))
-    }
-
-    @Test
-    fun subtractDimension3() {
-        assertEquals(DpCubed(0f), (2.dp * 3.dp * 1.dp) - (3.dp * 2.dp * 1.dp))
-    }
-
-    @Test
-    fun divideDimension3() {
-        assertEquals(DpCubed(1f), (2.dp * 5.dp * 1.dp) / 10f)
-    }
-
-    @Test
-    fun divideDimension3Dimension() {
-        assertEquals(DpSquared(1f), (2.dp * 2.dp * 1.dp) / 4.dp)
-    }
-
-    @Test
-    fun divideDimension3Dimension2() {
-        assertEquals(1f, ((2.dp * 2.dp * 1.dp) / (2.dp * 2.dp)).value, 0f)
-    }
-
-    @Test
-    fun divideDimension3Dimension3() {
-        assertEquals(1f, (2.dp * 2.dp * 1.dp) / (2.dp * 2.dp * 1.dp))
-    }
-
-    @Test
-    fun multiplyDimension3() {
-        assertEquals(DpCubed(4f), (2.dp * 1.dp * 1.dp) * 2f)
-    }
-
-    @Test
-    fun compareDimension3() {
-        assertTrue(DpCubed(0f) < DpCubed(Float.MIN_VALUE))
-        assertTrue(DpCubed(1f) < DpCubed(3f))
-        assertTrue(DpCubed(1f) == DpCubed(1f))
-        assertTrue(DpCubed(1f) > DpCubed(0f))
-    }
-
-    @Test
-    fun addDimensionInverse() {
-        assertEquals(DpInverse(1f), 1 / 2.dp + 1 / 2.dp)
-    }
-
-    @Test
-    fun subtractDimensionInverse() {
-        assertEquals(DpInverse(0f), 1 / 2.dp - 1 / 2.dp)
-    }
-
-    @Test
-    fun divideDimensionInverse() {
-        assertEquals(DpInverse(1f), (10 / 1.dp) / 10f)
-    }
-
-    @Test
-    fun multiplyDimensionInverse() {
-        assertEquals(DpInverse(4f), (1 / 2.dp) * 8f)
-    }
-
-    @Test
-    fun multiplyDimensionInverseDimension() {
-        assertEquals(4f, (1 / 2.dp) * 8.dp)
-    }
-
-    @Test
-    fun multiplyDimensionInverseDimension2() {
-        assertEquals(4f, ((1 / 2.dp) * (8.dp * 1.dp)).value, 0f)
-    }
-
-    @Test
-    fun multiplyDimensionInverseDimension3() {
-        assertEquals(DpSquared(4f), (1 / 2.dp) * (8.dp * 1.dp * 1.dp))
-    }
-
-    @Test
-    fun compareDimensionInverse() {
-        assertTrue(DpInverse(0f) < DpInverse(Float.MIN_VALUE))
-        assertTrue(DpInverse(1f) < DpInverse(3f))
-        assertTrue(DpInverse(1f) == DpInverse(1f))
-        assertTrue(DpInverse(1f) > DpInverse(0f))
-    }
-
-    @Test
     fun minTest() {
         assertEquals(10f, min(10.dp, 20.dp).value, 0f)
         assertEquals(10f, min(20.dp, 10.dp).value, 0f)
@@ -395,12 +239,12 @@
     }
 
     @Test
-    fun testUseOrElseTrue() {
-        assertTrue(Dp(1f).useOrElse { Dp.Unspecified }.isSpecified)
+    fun testTakeOrElseTrue() {
+        assertTrue(Dp(1f).takeOrElse { Dp.Unspecified }.isSpecified)
     }
 
     @Test
-    fun testUseOrElseFalse() {
-        assertTrue(Dp.Unspecified.useOrElse { Dp(1f) }.isSpecified)
+    fun testTakeOrElseFalse() {
+        assertTrue(Dp.Unspecified.takeOrElse { Dp(1f) }.isSpecified)
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/TextUnitTest.kt b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/TextUnitTest.kt
index 75ec8d3..602bcfb 100644
--- a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/TextUnitTest.kt
+++ b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/TextUnitTest.kt
@@ -1080,12 +1080,12 @@
     }
 
     @Test
-    fun testUseOrElseTrue() {
-        Assert.assertTrue(1.sp.useOrElse { TextUnit.Unspecified }.isSpecified)
+    fun testTakeOrElseTrue() {
+        Assert.assertTrue(1.sp.takeOrElse { TextUnit.Unspecified }.isSpecified)
     }
 
     @Test
-    fun testUseOrElseFalse() {
-        Assert.assertTrue(TextUnit.Unspecified.useOrElse { 1.sp }.isSpecified)
+    fun testTakeOrElseFalse() {
+        Assert.assertTrue(TextUnit.Unspecified.takeOrElse { 1.sp }.isSpecified)
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/UptimeTest.kt b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/UptimeTest.kt
index 8a60873..14493a0 100644
--- a/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/UptimeTest.kt
+++ b/compose/ui/ui-unit/src/test/kotlin/androidx/compose/ui/unit/UptimeTest.kt
@@ -79,12 +79,12 @@
     }
 
     @Test
-    fun testUseOrElseTrue() {
-        assertTrue(Uptime(1).useOrElse { Uptime.Unspecified }.isSpecified)
+    fun testTakeOrElseTrue() {
+        assertTrue(Uptime(1).takeOrElse { Uptime.Unspecified }.isSpecified)
     }
 
     @Test
-    fun testUseOrElseFalse() {
-        assertTrue(Uptime.Unspecified.useOrElse { Uptime(1) }.isSpecified)
+    fun testTakeOrElseFalse() {
+        assertTrue(Uptime.Unspecified.takeOrElse { Uptime(1) }.isSpecified)
     }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-util/api/current.txt b/compose/ui/ui-util/api/current.txt
index 7791c3e..49cf86d 100644
--- a/compose/ui/ui-util/api/current.txt
+++ b/compose/ui/ui-util/api/current.txt
@@ -26,7 +26,6 @@
   public final class JvmMiscHelpersKt {
     method public static StringBuilder deleteAt(StringBuilder, int index);
     method public static String format(String, java.lang.Object?... args);
-    method public static int identityHashCode(Object?);
   }
 
   public final class ListUtilsKt {
diff --git a/compose/ui/ui-util/api/public_plus_experimental_current.txt b/compose/ui/ui-util/api/public_plus_experimental_current.txt
index 7791c3e..49cf86d 100644
--- a/compose/ui/ui-util/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-util/api/public_plus_experimental_current.txt
@@ -26,7 +26,6 @@
   public final class JvmMiscHelpersKt {
     method public static StringBuilder deleteAt(StringBuilder, int index);
     method public static String format(String, java.lang.Object?... args);
-    method public static int identityHashCode(Object?);
   }
 
   public final class ListUtilsKt {
diff --git a/compose/ui/ui-util/api/restricted_current.txt b/compose/ui/ui-util/api/restricted_current.txt
index 7791c3e..49cf86d 100644
--- a/compose/ui/ui-util/api/restricted_current.txt
+++ b/compose/ui/ui-util/api/restricted_current.txt
@@ -26,7 +26,6 @@
   public final class JvmMiscHelpersKt {
     method public static StringBuilder deleteAt(StringBuilder, int index);
     method public static String format(String, java.lang.Object?... args);
-    method public static int identityHashCode(Object?);
   }
 
   public final class ListUtilsKt {
diff --git a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt
index ce7dee3..b24fe06 100644
--- a/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt
+++ b/compose/ui/ui-util/src/commonMain/kotlin/androidx/compose/ui/util/MiscHelpers.kt
@@ -16,16 +16,6 @@
 
 package androidx.compose.ui.util
 
-expect fun Any?.identityHashCode(): Int
-
 expect fun String.format(vararg args: Any?): String
 
 expect fun StringBuilder.deleteAt(index: Int): StringBuilder
-
-expect class TreeSet<E>(comparator: Comparator<in E>) {
-    fun add(element: E): Boolean
-    fun remove(element: E): Boolean
-    fun first(): E
-    fun contains(element: E): Boolean
-    fun isEmpty(): Boolean
-}
diff --git a/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt b/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt
index 197e5e1..be14a1b 100644
--- a/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt
+++ b/compose/ui/ui-util/src/jvmMain/kotlin/androidx/compose/ui/util/JvmMiscHelpers.kt
@@ -16,13 +16,9 @@
 
 package androidx.compose.ui.util
 
-actual fun Any?.identityHashCode(): Int = if (this == null) 0 else System.identityHashCode(this)
-
 actual fun String.format(vararg args: Any?): String = java.lang.String.format(this, *args)
 
 actual fun StringBuilder.deleteAt(index: Int): StringBuilder {
     this.deleteCharAt(index)
     return this
 }
-
-actual typealias TreeSet<T> = java.util.TreeSet<T>
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 3897398..b64837d 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -1987,9 +1987,9 @@
     method public static inline boolean isSpecified-FK8aYYs(long);
     method public static inline boolean isUnspecified-FK8aYYs(long);
     method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
     method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
     method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
-    method public static inline long useOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
   }
 
   public final class SubcomposeLayoutKt {
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index 3897398..b64837d 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -1987,9 +1987,9 @@
     method public static inline boolean isSpecified-FK8aYYs(long);
     method public static inline boolean isUnspecified-FK8aYYs(long);
     method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
     method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
     method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
-    method public static inline long useOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
   }
 
   public final class SubcomposeLayoutKt {
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index e3dabe4..88c1c65 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -2034,9 +2034,9 @@
     method public static inline boolean isSpecified-FK8aYYs(long);
     method public static inline boolean isUnspecified-FK8aYYs(long);
     method @androidx.compose.runtime.Stable public static long lerp-bKVCie4(long start, long stop, float fraction);
+    method public static inline long takeOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
     method @androidx.compose.runtime.Stable public static operator long times-Sp6zcS4(long, long size);
     method @androidx.compose.runtime.Stable public static operator long times-ngKnWWw(long, long scaleFactor);
-    method public static inline long useOrElse-L-byAFk(long, kotlin.jvm.functions.Function0<androidx.compose.ui.layout.ScaleFactor> block);
   }
 
   public final class SubcomposeLayoutKt {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
index 96b153b..c2a98e8 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/GraphicsLayerTest.kt
@@ -20,11 +20,13 @@
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
 import androidx.compose.testutils.assertPixels
 import androidx.compose.ui.FixedSize
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Padding
-import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.background
 import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.geometry.Rect
@@ -32,9 +34,10 @@
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Outline
 import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.graphics.TransformOrigin
 import androidx.compose.ui.graphics.asAndroidBitmap
-import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.boundsInRoot
 import androidx.compose.ui.layout.globalBounds
@@ -366,4 +369,26 @@
             assertEquals(0f, bounds.height)
         }
     }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun invalidateWhenWeHaveSemanticModifierAfterLayer() {
+        var color by mutableStateOf(Color.Red)
+        rule.setContent {
+            FixedSize(
+                5,
+                Modifier.graphicsLayer().testTag("tag").background(color)
+            )
+        }
+
+        rule.runOnIdle {
+            color = Color.Green
+        }
+
+        rule.onNodeWithTag("tag")
+            .captureToImage()
+            .assertPixels {
+                color
+            }
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
index 647effa..471e53b 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/Wrapper.kt
@@ -17,6 +17,7 @@
 
 import android.app.Activity
 import android.os.Build
+import android.util.Log
 import android.view.View
 import android.view.ViewGroup
 import android.widget.FrameLayout
@@ -44,6 +45,8 @@
 import java.util.Collections
 import java.util.WeakHashMap
 
+private val TAG = "Wrapper"
+
 /**
  * Composes the children of the view with the passed in [composable].
  *
@@ -206,10 +209,14 @@
     // assignment. This allows the InspectorInfo lambdas to be stripped from release builds.
     @OptIn(InternalComposeApi::class)
     if (!isDebugInspectorInfoEnabled) {
-        val packageClass = Class.forName("androidx.compose.ui.platform.InspectableValueKt")
-        val field = packageClass.getDeclaredField("isDebugInspectorInfoEnabled")
-        field.isAccessible = true
-        field.setBoolean(null, true)
+        try {
+            val packageClass = Class.forName("androidx.compose.ui.platform.InspectableValueKt")
+            val field = packageClass.getDeclaredField("isDebugInspectorInfoEnabled")
+            field.isAccessible = true
+            field.setBoolean(null, true)
+        } catch (ignored: Exception) {
+            Log.w(TAG, "Could not access isDebugInspectorInfoEnabled. Please set explicitly.")
+        }
     }
 }
 
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/Constants.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/Constants.kt
index e7d546e..6e04fa1 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/Constants.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/gesture/Constants.kt
@@ -102,13 +102,13 @@
  */
 // TODO(shepshapard): Create variants of HorizontalDragGestureFilter et al for
 // paging, which use this constant.
-val PagingTouchSlop = TouchSlop * 2.dp
+val PagingTouchSlop = TouchSlop * 2f
 
 /**
  * The distance a touch has to travel for the framework to be confident that
  * the gesture is a panning gesture.
  */
-val PanSlop = TouchSlop * 2.dp
+val PanSlop = TouchSlop * 2f
 
 /**
  * The absolute cumulative average change in distance of all pointers from the
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt
index 99ff43df..8928637 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ScaleFactor.kt
@@ -128,7 +128,7 @@
  * If this [ScaleFactor] [isSpecified] then this is returned, otherwise [block] is executed
  * and its result is returned.
  */
-inline fun ScaleFactor.useOrElse(block: () -> ScaleFactor): ScaleFactor =
+inline fun ScaleFactor.takeOrElse(block: () -> ScaleFactor): ScaleFactor =
     if (isSpecified) this else block()
 
 /**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt
index d439d47..394e4eb 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/DepthSortedSet.kt
@@ -16,9 +16,6 @@
 
 package androidx.compose.ui.node
 
-import androidx.compose.ui.util.TreeSet
-import androidx.compose.ui.util.identityHashCode
-
 /**
  * The set of [LayoutNode]s which orders items by their [LayoutNode.depth] and
  * allows modifications(additions and removals) while we iterate through it via [popEach].
@@ -44,10 +41,10 @@
             if (depthDiff != 0) {
                 return depthDiff
             }
-            return l1.identityHashCode().compareTo(l2.identityHashCode())
+            return l1.hashCode().compareTo(l2.hashCode())
         }
     }
-    private val set = TreeSet<LayoutNode>(DepthComparator)
+    private val set = TreeSet(DepthComparator)
 
     fun contains(node: LayoutNode): Boolean {
         val contains = set.contains(node)
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
index 867cd1c..d26b1f8 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/OnPositionedDispatcher.kt
@@ -17,7 +17,6 @@
 package androidx.compose.ui.node
 
 import androidx.compose.runtime.collection.mutableVectorOf
-import androidx.compose.ui.util.identityHashCode
 
 /**
  * Tracks the nodes being positioned and dispatches OnPositioned callbacks when we finished
@@ -64,7 +63,7 @@
                 if (depthDiff != 0) {
                     return depthDiff
                 }
-                return a.identityHashCode().compareTo(b.identityHashCode())
+                return a.hashCode().compareTo(b.hashCode())
             }
         }
     }
diff --git a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TreeSet.kt
similarity index 69%
copy from car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
copy to compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TreeSet.kt
index 990f255..c717323 100644
--- a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/TreeSet.kt
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.car.app.model;
+package androidx.compose.ui.node
 
-import androidx.car.app.IOnDoneCallback;
-
-/** @hide */
-oneway interface ISearchListener {
-  void onSearchTextChanged(String text, IOnDoneCallback callback) = 1;
-  void onSearchSubmitted(String text, IOnDoneCallback callback) = 2;
+internal expect class TreeSet<E>(comparator: Comparator<in E>) {
+    fun add(element: E): Boolean
+    fun remove(element: E): Boolean
+    fun first(): E
+    fun contains(element: E): Boolean
+    fun isEmpty(): Boolean
 }
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsWrapper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsWrapper.kt
index f40d31b..9c951f0 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsWrapper.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsWrapper.kt
@@ -40,6 +40,7 @@
     }
 
     override fun onModifierChanged() {
+        super.onModifierChanged()
         layoutNode.owner?.onSemanticsChange()
     }
 
diff --git a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/node/JvmTreeSet.kt
similarity index 69%
copy from car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
copy to compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/node/JvmTreeSet.kt
index 990f255..c0cd263 100644
--- a/car/app/app/src/main/aidl/androidx/car/app/model/ISearchListener.aidl
+++ b/compose/ui/ui/src/jvmMain/kotlin/androidx/compose/ui/node/JvmTreeSet.kt
@@ -1,3 +1,4 @@
+// ktlint-disable filename
 /*
  * Copyright 2020 The Android Open Source Project
  *
@@ -14,12 +15,7 @@
  * limitations under the License.
  */
 
-package androidx.car.app.model;
+package androidx.compose.ui.node
 
-import androidx.car.app.IOnDoneCallback;
-
-/** @hide */
-oneway interface ISearchListener {
-  void onSearchTextChanged(String text, IOnDoneCallback callback) = 1;
-  void onSearchSubmitted(String text, IOnDoneCallback callback) = 2;
-}
+internal actual class TreeSet<E> actual constructor(comparator: Comparator<in E>) :
+    java.util.TreeSet<E>(comparator)
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt
index e3b334b..23156b2 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ConstraintsTest.kt
@@ -24,7 +24,7 @@
 import androidx.compose.ui.unit.hasFixedWidth
 import androidx.compose.ui.unit.isZero
 import androidx.compose.ui.unit.offset
-import androidx.compose.ui.unit.satisfiedBy
+import androidx.compose.ui.unit.isSatisfiedBy
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
@@ -157,13 +157,13 @@
     @Test
     fun satisfiedBy() {
         val constraints = Constraints(2, 5, 7, 9)
-        assertTrue(constraints.satisfiedBy(IntSize(4, 8)))
-        assertTrue(constraints.satisfiedBy(IntSize(2, 7)))
-        assertTrue(constraints.satisfiedBy(IntSize(5, 9)))
-        assertFalse(constraints.satisfiedBy(IntSize(1, 8)))
-        assertFalse(constraints.satisfiedBy(IntSize(7, 8)))
-        assertFalse(constraints.satisfiedBy(IntSize(4, 5)))
-        assertFalse(constraints.satisfiedBy(IntSize(4, 11)))
+        assertTrue(constraints.isSatisfiedBy(IntSize(4, 8)))
+        assertTrue(constraints.isSatisfiedBy(IntSize(2, 7)))
+        assertTrue(constraints.isSatisfiedBy(IntSize(5, 9)))
+        assertFalse(constraints.isSatisfiedBy(IntSize(1, 8)))
+        assertFalse(constraints.isSatisfiedBy(IntSize(7, 8)))
+        assertFalse(constraints.isSatisfiedBy(IntSize(4, 5)))
+        assertFalse(constraints.isSatisfiedBy(IntSize(4, 11)))
     }
 
     @Test
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ScaleFactorTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ScaleFactorTest.kt
index 5bb2a4a..fe6e120d 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ScaleFactorTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/layout/ScaleFactorTest.kt
@@ -125,12 +125,12 @@
     }
 
     @Test
-    fun testUseOrElseTrue() {
-        assertTrue(ScaleFactor(1f, 1f).useOrElse { ScaleFactor.Unspecified }.isSpecified)
+    fun testTakeOrElseTrue() {
+        assertTrue(ScaleFactor(1f, 1f).takeOrElse { ScaleFactor.Unspecified }.isSpecified)
     }
 
     @Test
-    fun testUseOrElseFalse() {
-        assertTrue(ScaleFactor.Unspecified.useOrElse { ScaleFactor(1f, 1f) }.isSpecified)
+    fun testTakeOrElseFalse() {
+        assertTrue(ScaleFactor.Unspecified.takeOrElse { ScaleFactor(1f, 1f) }.isSpecified)
     }
 }
\ No newline at end of file
diff --git a/core/README.md b/core/README.md
index d92c2f4..8ffb0b8 100644
--- a/core/README.md
+++ b/core/README.md
@@ -4,7 +4,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/core)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/core/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/core/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/classes.html)
 
diff --git a/core/core-role/README.md b/core/core-role/README.md
index b14b8f1..4247596 100644
--- a/core/core-role/README.md
+++ b/core/core-role/README.md
@@ -6,7 +6,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/core)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/core/core-role/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/core/core-role/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/classes.html)
 
diff --git a/development/aosp.sh b/development/aosp.sh
index 83e6a9b..32c4c12 100755
--- a/development/aosp.sh
+++ b/development/aosp.sh
@@ -18,7 +18,7 @@
   repo download "platform/frameworks/support" ${REPO_ID:1:-1}  \
     && BRANCH=`git log -1 | grep Change-Id | awk '{print $2}'` \
     && git checkout -B "aosp/$BRANCH"                          \
-    && git branch --set-upstream-to=aosp/androidx-master-dev
+    && git branch --set-upstream-to=aosp/androidx-main
 }
 
 function fn_aosp_merged {
@@ -89,7 +89,7 @@
   && repo download "platform/frameworks/support" "$PATCH"    \
   && BRANCH=`git log -1 | grep Change-Id | awk '{print $2}'` \
   && git checkout -B "`whoami`/$BRANCH"                     \
-  && git branch --set-upstream-to=aosp/androidx-master-dev
+  && git branch --set-upstream-to=aosp/androidx-main
 elif [[ "$1" == "r" ]]; then
   fn_git_check_uncommitted_changes
 
diff --git a/development/build_log_simplifier/VALIDATION_FAILURE.md b/development/build_log_simplifier/VALIDATION_FAILURE.md
index d02c57c..d0f8519 100644
--- a/development/build_log_simplifier/VALIDATION_FAILURE.md
+++ b/development/build_log_simplifier/VALIDATION_FAILURE.md
@@ -12,13 +12,13 @@
 
 ##   Where is the baseline file?
 
-   *   Exemptions for output that is always/deterministically generated by the build go in [messages.ignore](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/development/build_log_simplifier/messages.ignore)
+   *   Exemptions for output that is always/deterministically generated by the build go in [messages.ignore](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/development/build_log_simplifier/messages.ignore)
 
-       *   We may periodically garbage collect exemptions in this file via [gc.sh](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/development/build_log_simplifier/gc.sh), so they may be automatically removed after their underlying issue is fixed
+       *   We may periodically garbage collect exemptions in this file via [gc.sh](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/development/build_log_simplifier/gc.sh), so they may be automatically removed after their underlying issue is fixed
 
        *   In most cases, this will be the correct file to update
 
-   *   Exemptions for output that is only sometimes (flakily) generated by the build go in [message-flakes.ignore](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/development/build_log_simplifier/message-flakes.ignore)
+   *   Exemptions for output that is only sometimes (flakily) generated by the build go in [message-flakes.ignore](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/development/build_log_simplifier/message-flakes.ignore)
 
        *   These exemptions will not be automatically garbage collected
 
diff --git a/development/build_log_simplifier/build_log_simplifier.py b/development/build_log_simplifier/build_log_simplifier.py
index e5ddcd1..569b5a1 100755
--- a/development/build_log_simplifier/build_log_simplifier.py
+++ b/development/build_log_simplifier/build_log_simplifier.py
@@ -549,7 +549,7 @@
             print("Instructions:")
             print("  Fix these messages if you can.")
             print("  Otherwise, you may suppress them.")
-            print("  See also https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/development/build_log_simplifier/VALIDATION_FAILURE.md")
+            print("  See also https://android.googlesource.com/platform/frameworks/support/+/androidx-main/development/build_log_simplifier/VALIDATION_FAILURE.md")
             print("")
             new_exemptions_path = log_paths[0] + ".ignore"
             # filter out any inconsistently observed messages so we don't try to exempt them twice
diff --git a/development/importMaven/build.gradle.kts b/development/importMaven/build.gradle.kts
index 96faade..f6110c9 100644
--- a/development/importMaven/build.gradle.kts
+++ b/development/importMaven/build.gradle.kts
@@ -70,12 +70,12 @@
     java
 }
 
+val metalavaBuildId: String? = findProperty("metalavaBuildId") as String?
 repositories {
     jcenter()
     mavenCentral()
     google()
     gradlePluginPortal()
-    val metalavaBuildId: String? = findProperty("metalavaBuildId") as String?
     if (metalavaBuildId != null) {
         maven(url="https://androidx.dev/metalava/builds/${metalavaBuildId}/artifacts/repo/m2repository")
     }
@@ -457,18 +457,30 @@
 tasks {
     val fetchArtifacts by creating {
         doLast {
+            var numArtifactsFound = 0
             println("\r\nAll Files with Dependencies")
             allFilesWithDependencies.incoming.artifactView {
                 lenient(true)
             }.artifacts.forEach {
                 copyArtifact(it, internal = isInternalArtifact(it))
+                numArtifactsFound++
             }
             gradleModuleMetadata.incoming.artifactView {
                 lenient(true)
             }.artifacts.forEach {
                 copyArtifact(it, internal = isInternalArtifact(it))
+                numArtifactsFound++
             }
-            println("\r\nResolved artifacts for $artifactName.")
+            if (numArtifactsFound < 1) {
+                var message = "Artifact $artifactName not found!"
+                if (metalavaBuildId != null) {
+                    message += "\nMake sure that ab/$metalavaBuildId contains the `metalava` "
+                    message += "target and that it has finished building, or see "
+                    message += "ab/metalava-master for available build ids"
+                }
+                throw GradleException(message)
+            }
+	    println("\r\nResolved $numArtifactsFound artifacts for $artifactName.")
         }
     }
 }
diff --git a/development/importMaven/import_maven_artifacts.py b/development/importMaven/import_maven_artifacts.py
index 33df1c2..8242926 100755
--- a/development/importMaven/import_maven_artifacts.py
+++ b/development/importMaven/import_maven_artifacts.py
@@ -45,7 +45,7 @@
     parser.add_argument('-n', '--name', help=NAME_HELP,
                         required=True, dest='name')
     parser.add_argument('-mb', '--metalava-build-id', help=METALAVA_BUILD_ID_HELP,
-                        required=False, dest='matalava_build_id')
+                        required=False, dest='metalava_build_id')
     parser.add_argument('-ab', '--allow-bintray', help=ALLOW_BINTRAY_HELP,
                         required=False, action='store_true')
     parse_result = parser.parse_args()
@@ -55,9 +55,9 @@
     # Add -Dorg.gradle.debug=true to debug or --stacktrace to see the stack trace
     command = './gradlew --build-file build.gradle.kts -PartifactName=%s' % (
         artifact_name)
-    matalava_build_id = parse_result.matalava_build_id
-    if (matalava_build_id):
-      command = command + ' -PmetalavaBuildId=%s' % (matalava_build_id)
+    metalava_build_id = parse_result.metalava_build_id
+    if (metalava_build_id):
+      command = command + ' -PmetalavaBuildId=%s' % (metalava_build_id)
     if (parse_result.allow_bintray):
       command = command + ' -PallowBintray'
 
diff --git a/development/update_library_versions.py b/development/update_library_versions.py
index 1f2ba6b..826c22c1 100755
--- a/development/update_library_versions.py
+++ b/development/update_library_versions.py
@@ -138,7 +138,7 @@
 
 def increment_alpha_beta_version(version):
 	# Only increment alpha and beta versions.
-	# rc and stable should never need to be incremented in the androidx-master-dev branch
+	# rc and stable should never need to be incremented in the androidx-main branch
 	# Suffix changes should be done manually.
 	changed = False
 	if 'alpha' in version or 'beta' in version:
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index 52800ec..da293ba 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -43,6 +43,7 @@
     docs("androidx.compose.material:material-icons-core:1.0.0-alpha09")
     samples("androidx.compose.material:material-icons-core-samples:1.0.0-alpha09")
     docs("androidx.compose.material:material-icons-extended:1.0.0-alpha09")
+    docs("androidx.compose.material:material-ripple:1.0.0-alpha09")
     samples("androidx.compose.material:material-samples:1.0.0-alpha09")
     docs("androidx.compose.runtime:runtime:1.0.0-alpha09")
     docs("androidx.compose.runtime:runtime-dispatch:1.0.0-alpha09")
@@ -217,7 +218,7 @@
     docs("androidx.wear:wear-input:1.0.0")
     docs("androidx.wear:wear-input-testing:1.0.0")
     docs("androidx.webkit:webkit:1.4.0")
-    docs("androidx.window:window:1.0.0-alpha02")
+    docs("androidx.window:window:1.0.0-alpha01")
     stubs(fileTree(dir: '../window/stubs/', include: ['window-sidecar-release-0.1.0-alpha01.aar']))
     stubs(project(":window:window-extensions"))
     docs("androidx.work:work-gcm:2.5.0-beta02")
diff --git a/fragment/README.md b/fragment/README.md
index 413f993..7ad2c0a 100644
--- a/fragment/README.md
+++ b/fragment/README.md
@@ -6,7 +6,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/fragment)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/fragment/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/fragment/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/fragment/app/package-summary)
 
diff --git a/leanback/leanback/src/androidTest/AndroidManifest.xml b/leanback/leanback/src/androidTest/AndroidManifest.xml
index 41194c1..2f345f9 100644
--- a/leanback/leanback/src/androidTest/AndroidManifest.xml
+++ b/leanback/leanback/src/androidTest/AndroidManifest.xml
@@ -16,6 +16,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="androidx.leanback.test">
 
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
     <application
         android:supportsRtl="true">
         <activity android:name="androidx.leanback.widget.GridActivity"
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchFragmentTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchFragmentTest.java
index 0565f5f..cd4bca8 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchFragmentTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchFragmentTest.java
@@ -18,9 +18,13 @@
  */
 package androidx.leanback.app;
 
+import static org.junit.Assert.assertTrue;
+
 import android.content.Context;
 import android.os.Build;
 import android.os.Bundle;
+import android.speech.SpeechRecognizer;
+import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -40,11 +44,14 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
+import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.testutils.AnimationTest;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Objects;
+
 @LargeTest
 @AnimationTest
 @RunWith(AndroidJUnit4.class)
@@ -154,4 +161,119 @@
         });
         leakDetector.assertNoLeak();
     }
+
+    @Test
+    public void testFocusWithSpeechRecognizerDisabled() {
+        SingleFragmentTestActivity activity = launchAndWaitActivity(
+                SpeechRecognizerDisabledFragment.class, 1000);
+
+        assertTrue(activity.findViewById(R.id.lb_search_text_editor).hasFocus());
+
+        sendKeys(KeyEvent.KEYCODE_A);
+        sendKeys(KeyEvent.KEYCODE_ENTER);
+
+        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return ((SearchFragment) activity.getTestFragment())
+                        .getRowsFragment().getVerticalGridView().hasFocus();
+            }
+        });
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
+        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return activity.findViewById(R.id.lb_search_text_editor).hasFocus();
+            }
+        });
+    }
+
+    @Test
+    public void testFocusWithSpeechRecognizerEnabled() throws Exception {
+
+        // Skip the test for devices which do not have SpeechRecognizer
+        if (!SpeechRecognizer.isRecognitionAvailable(
+                InstrumentationRegistry.getInstrumentation().getContext())) {
+            return;
+        }
+
+        SingleFragmentTestActivity activity = launchAndWaitActivity(
+                SpeechRecognizerEnabledFragment.class, 1000);
+
+        assertTrue(activity.findViewById(R.id.lb_search_bar_speech_orb).hasFocus());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+
+        assertTrue(activity.findViewById(R.id.lb_search_text_editor).hasFocus());
+
+        sendKeys(KeyEvent.KEYCODE_A);
+        sendKeys(KeyEvent.KEYCODE_ENTER);
+
+        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return ((SearchFragment) activity.getTestFragment())
+                        .getRowsFragment().getVerticalGridView().hasFocus();
+            }
+        });
+
+        Thread.sleep(1000);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
+        assertTrue(activity.findViewById(R.id.lb_search_bar_speech_orb).hasFocus());
+    }
+
+    static class SearchSupportTestFragment extends SearchFragment
+            implements SearchFragment.SearchResultProvider {
+        ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+        String mPreviousQuery;
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setSearchResultProvider(this);
+        }
+
+        @Override
+        public ObjectAdapter getResultsAdapter() {
+            return mRowsAdapter;
+        }
+
+        @Override
+        public boolean onQueryTextChange(String newQuery) {
+            if (!Objects.equals(mPreviousQuery, newQuery)) {
+                mRowsAdapter.clear();
+                loadData(mRowsAdapter, 10, 1);
+                mPreviousQuery = newQuery;
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public boolean onQueryTextSubmit(String query) {
+            if (!Objects.equals(mPreviousQuery, query)) {
+                mRowsAdapter.clear();
+                loadData(mRowsAdapter, 10, 1);
+                mPreviousQuery = query;
+                return true;
+            }
+            return false;
+        }
+    }
+
+    public static final class SpeechRecognizerDisabledFragment extends SearchSupportTestFragment {
+        @Override
+        boolean isSpeechRecognizerAvailable() {
+            return false;
+        }
+    }
+
+    public static final class SpeechRecognizerEnabledFragment extends SearchSupportTestFragment {
+        @Override
+        boolean isSpeechRecognizerAvailable() {
+            return true;
+        }
+    }
 }
diff --git a/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchSupportFragmentTest.java b/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchSupportFragmentTest.java
index 446400b..804ffa3 100644
--- a/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchSupportFragmentTest.java
+++ b/leanback/leanback/src/androidTest/java/androidx/leanback/app/SearchSupportFragmentTest.java
@@ -15,9 +15,13 @@
  */
 package androidx.leanback.app;
 
+import static org.junit.Assert.assertTrue;
+
 import android.content.Context;
 import android.os.Build;
 import android.os.Bundle;
+import android.speech.SpeechRecognizer;
+import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -37,11 +41,14 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SdkSuppress;
+import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.testutils.AnimationTest;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Objects;
+
 @LargeTest
 @AnimationTest
 @RunWith(AndroidJUnit4.class)
@@ -151,4 +158,119 @@
         });
         leakDetector.assertNoLeak();
     }
+
+    @Test
+    public void testFocusWithSpeechRecognizerDisabled() {
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(
+                SpeechRecognizerDisabledFragment.class, 1000);
+
+        assertTrue(activity.findViewById(R.id.lb_search_text_editor).hasFocus());
+
+        sendKeys(KeyEvent.KEYCODE_A);
+        sendKeys(KeyEvent.KEYCODE_ENTER);
+
+        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return ((SearchSupportFragment) activity.getTestFragment())
+                        .getRowsSupportFragment().getVerticalGridView().hasFocus();
+            }
+        });
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
+        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return activity.findViewById(R.id.lb_search_text_editor).hasFocus();
+            }
+        });
+    }
+
+    @Test
+    public void testFocusWithSpeechRecognizerEnabled() throws Exception {
+
+        // Skip the test for devices which do not have SpeechRecognizer
+        if (!SpeechRecognizer.isRecognitionAvailable(
+                InstrumentationRegistry.getInstrumentation().getContext())) {
+            return;
+        }
+
+        SingleSupportFragmentTestActivity activity = launchAndWaitActivity(
+                SpeechRecognizerEnabledFragment.class, 1000);
+
+        assertTrue(activity.findViewById(R.id.lb_search_bar_speech_orb).hasFocus());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+
+        assertTrue(activity.findViewById(R.id.lb_search_text_editor).hasFocus());
+
+        sendKeys(KeyEvent.KEYCODE_A);
+        sendKeys(KeyEvent.KEYCODE_ENTER);
+
+        PollingCheck.waitFor(new PollingCheck.PollingCheckCondition() {
+            @Override
+            public boolean canProceed() {
+                return ((SearchSupportFragment) activity.getTestFragment())
+                        .getRowsSupportFragment().getVerticalGridView().hasFocus();
+            }
+        });
+
+        Thread.sleep(1000);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
+        assertTrue(activity.findViewById(R.id.lb_search_bar_speech_orb).hasFocus());
+    }
+
+    static class SearchSupportTestFragment extends SearchSupportFragment
+            implements SearchSupportFragment.SearchResultProvider {
+        ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+        String mPreviousQuery;
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setSearchResultProvider(this);
+        }
+
+        @Override
+        public ObjectAdapter getResultsAdapter() {
+            return mRowsAdapter;
+        }
+
+        @Override
+        public boolean onQueryTextChange(String newQuery) {
+            if (!Objects.equals(mPreviousQuery, newQuery)) {
+                mRowsAdapter.clear();
+                loadData(mRowsAdapter, 10, 1);
+                mPreviousQuery = newQuery;
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public boolean onQueryTextSubmit(String query) {
+            if (!Objects.equals(mPreviousQuery, query)) {
+                mRowsAdapter.clear();
+                loadData(mRowsAdapter, 10, 1);
+                mPreviousQuery = query;
+                return true;
+            }
+            return false;
+        }
+    }
+
+    public static final class SpeechRecognizerDisabledFragment extends SearchSupportTestFragment {
+        @Override
+        boolean isSpeechRecognizerAvailable() {
+            return false;
+        }
+    }
+
+    public static final class SpeechRecognizerEnabledFragment extends SearchSupportTestFragment {
+        @Override
+        boolean isSpeechRecognizerAvailable() {
+            return true;
+        }
+    }
 }
diff --git a/leanback/leanback/src/main/java/androidx/leanback/app/SearchFragment.java b/leanback/leanback/src/main/java/androidx/leanback/app/SearchFragment.java
index 644405a..38bcc52 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/app/SearchFragment.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/app/SearchFragment.java
@@ -240,6 +240,8 @@
         }
     };
 
+    boolean mSpeechRecognizerEnabled;
+
     @Override
     public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                            int[] grantResults) {
@@ -370,7 +372,11 @@
                 if (mRowsFragment != null && mRowsFragment.getView() != null
                         && mRowsFragment.getView().hasFocus()) {
                     if (direction == View.FOCUS_UP) {
-                        return mSearchBar.findViewById(R.id.lb_search_bar_speech_orb);
+                        if (mSpeechRecognizerEnabled) {
+                            return mSearchBar.findViewById(R.id.lb_search_bar_speech_orb);
+                        } else {
+                            return mSearchBar;
+                        }
                     }
                 } else if (mSearchBar.hasFocus() && direction == View.FOCUS_DOWN) {
                     if (mRowsFragment.getView() != null
@@ -381,6 +387,15 @@
                 return null;
             }
         });
+
+        if (!isSpeechRecognizerAvailable()) {
+            if(mSearchBar.hasFocus()) {
+                mSearchBar.findViewById(R.id.lb_search_text_editor).requestFocus();
+            }
+            mSearchBar.findViewById(R.id.lb_search_bar_speech_orb).setFocusable(false);
+        } else {
+            mSpeechRecognizerEnabled = true;
+        }
         return root;
     }
 
@@ -402,7 +417,8 @@
     public void onResume() {
         super.onResume();
         mIsPaused = false;
-        if (mSpeechRecognitionCallback == null && null == mSpeechRecognizer) {
+        if (mSpeechRecognitionCallback == null && null == mSpeechRecognizer
+                && mSpeechRecognizerEnabled) {
             mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(
                     FragmentUtil.getContext(SearchFragment.this));
             mSearchBar.setSpeechRecognizer(mSpeechRecognizer);
@@ -766,6 +782,11 @@
         mSearchBar.setSearchQuery(query);
     }
 
+    boolean isSpeechRecognizerAvailable() {
+        return SpeechRecognizer.isRecognitionAvailable(
+                FragmentUtil.getContext(SearchFragment.this));
+    }
+
     static class ExternalQuery {
         String mQuery;
         boolean mSubmit;
diff --git a/leanback/leanback/src/main/java/androidx/leanback/app/SearchSupportFragment.java b/leanback/leanback/src/main/java/androidx/leanback/app/SearchSupportFragment.java
index 124da0b..3c3a515 100644
--- a/leanback/leanback/src/main/java/androidx/leanback/app/SearchSupportFragment.java
+++ b/leanback/leanback/src/main/java/androidx/leanback/app/SearchSupportFragment.java
@@ -235,6 +235,8 @@
         }
     };
 
+    boolean mSpeechRecognizerEnabled;
+
     @Override
     public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                            int[] grantResults) {
@@ -365,7 +367,11 @@
                 if (mRowsSupportFragment != null && mRowsSupportFragment.getView() != null
                         && mRowsSupportFragment.getView().hasFocus()) {
                     if (direction == View.FOCUS_UP) {
-                        return mSearchBar.findViewById(R.id.lb_search_bar_speech_orb);
+                        if (mSpeechRecognizerEnabled) {
+                            return mSearchBar.findViewById(R.id.lb_search_bar_speech_orb);
+                        } else {
+                            return mSearchBar;
+                        }
                     }
                 } else if (mSearchBar.hasFocus() && direction == View.FOCUS_DOWN) {
                     if (mRowsSupportFragment.getView() != null
@@ -376,6 +382,15 @@
                 return null;
             }
         });
+
+        if (!isSpeechRecognizerAvailable()) {
+            if (mSearchBar.hasFocus()) {
+                mSearchBar.findViewById(R.id.lb_search_text_editor).requestFocus();
+            }
+            mSearchBar.findViewById(R.id.lb_search_bar_speech_orb).setFocusable(false);
+        } else {
+            mSpeechRecognizerEnabled = true;
+        }
         return root;
     }
 
@@ -397,9 +412,9 @@
     public void onResume() {
         super.onResume();
         mIsPaused = false;
-        if (mSpeechRecognitionCallback == null && null == mSpeechRecognizer) {
-            mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(
-                    getContext());
+        if (mSpeechRecognitionCallback == null && null == mSpeechRecognizer
+                && mSpeechRecognizerEnabled) {
+            mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(getContext());
             mSearchBar.setSpeechRecognizer(mSpeechRecognizer);
         }
         if (mPendingStartRecognitionWhenPaused) {
@@ -761,6 +776,10 @@
         mSearchBar.setSearchQuery(query);
     }
 
+    boolean isSpeechRecognizerAvailable() {
+        return SpeechRecognizer.isRecognitionAvailable(getContext());
+    }
+
     static class ExternalQuery {
         String mQuery;
         boolean mSubmit;
diff --git a/navigation/navigation-dynamic-features-fragment/api/current.txt b/navigation/navigation-dynamic-features-fragment/api/current.txt
index 74621d5..73124fc8 100644
--- a/navigation/navigation-dynamic-features-fragment/api/current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/current.txt
@@ -30,7 +30,15 @@
 
   public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
     ctor public DynamicNavHostFragment();
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
     method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+    field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+  }
+
+  public static final class DynamicNavHostFragment.Companion {
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
   }
 
 }
diff --git a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
index 74621d5..73124fc8 100644
--- a/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/public_plus_experimental_current.txt
@@ -30,7 +30,15 @@
 
   public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
     ctor public DynamicNavHostFragment();
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
     method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+    field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+  }
+
+  public static final class DynamicNavHostFragment.Companion {
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
   }
 
 }
diff --git a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
index 74621d5..73124fc8 100644
--- a/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
+++ b/navigation/navigation-dynamic-features-fragment/api/restricted_current.txt
@@ -30,7 +30,15 @@
 
   public class DynamicNavHostFragment extends androidx.navigation.fragment.NavHostFragment {
     ctor public DynamicNavHostFragment();
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
     method protected com.google.android.play.core.splitinstall.SplitInstallManager createSplitInstallManager();
+    field public static final androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment.Companion Companion;
+  }
+
+  public static final class DynamicNavHostFragment.Companion {
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId, optional android.os.Bundle? startDestinationArgs);
+    method public androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment create(@NavigationRes int graphResId);
   }
 
 }
diff --git a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
index 7c33183..ee291df 100644
--- a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicFragmentNavigatorDestinationBuilderTest.kt
@@ -21,8 +21,10 @@
 import androidx.navigation.dynamicfeatures.createGraph
 import androidx.navigation.get
 import androidx.test.annotation.UiThreadTest
+import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
+import androidx.testutils.withActivity
 import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Rule
 import org.junit.Test
@@ -30,14 +32,17 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class DynamicFragmentNavigatorDestinationBuilderTest {
+public class DynamicFragmentNavigatorDestinationBuilderTest {
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityRule = androidx.test.rule.ActivityTestRule<TestActivity>(TestActivity::class.java)
-    private val fragmentManager get() = activityRule.activity.supportFragmentManager
+    public val rule: ActivityScenarioRule<TestActivity> = ActivityScenarioRule(
+        TestActivity::class.java
+    )
+    private val fragmentManager get() = rule.scenario.withActivity { supportFragmentManager }
 
     @UiThreadTest
-    @Test fun reified() {
+    @Test
+    public fun reified() {
         val navHostFragment = DynamicNavHostFragment()
         fragmentManager.beginTransaction()
             .add(android.R.id.content, navHostFragment)
@@ -52,7 +57,8 @@
     }
 
     @UiThreadTest
-    @Test fun moduleName() {
+    @Test
+    public fun moduleName() {
         val navHostFragment = DynamicNavHostFragment()
         fragmentManager.beginTransaction()
             .add(android.R.id.content, navHostFragment)
@@ -72,7 +78,8 @@
     }
 
     @UiThreadTest
-    @Test fun no_moduleName() {
+    @Test
+    public fun no_moduleName() {
         val navHostFragment = DynamicNavHostFragment()
         fragmentManager.beginTransaction()
             .add(android.R.id.content, navHostFragment)
@@ -94,5 +101,5 @@
 private const val MODULE_NAME = "module"
 private const val FRAGMENT_CLASS_NAME = "androidx.navigation.dynamicfeatures.fragment.TestFragment"
 
-class TestActivity : FragmentActivity()
-class TestFragment : Fragment()
+public class TestActivity : FragmentActivity()
+private class TestFragment : Fragment()
diff --git a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt
index 59e061f..e1fa686 100644
--- a/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/androidTest/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragmentTest.kt
@@ -20,9 +20,11 @@
 import androidx.fragment.app.FragmentActivity
 import androidx.navigation.dynamicfeatures.fragment.test.R
 import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import androidx.testutils.withActivity
+import com.google.android.play.core.splitinstall.SplitInstallManager
 import org.junit.Assert.assertEquals
 import org.junit.Rule
 import org.junit.Test
@@ -30,14 +32,16 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class DynamicNavHostFragmentTest {
+public class DynamicNavHostFragmentTest {
 
     @Suppress("DEPRECATION")
     @get:Rule
-    val activityTestRule = androidx.test.rule.ActivityTestRule(NavigationActivity::class.java)
+    public val activityTestRule: ActivityScenarioRule<NavigationActivity> = ActivityScenarioRule(
+        NavigationActivity::class.java
+    )
 
     @Test
-    fun createSplitInstallManager() {
+    public fun createSplitInstallManager() {
         val fragment = TestDynamicNavHostFragment()
         with(ActivityScenario.launch(NavigationActivity::class.java)) {
             withActivity {
@@ -49,15 +53,33 @@
         }
         assertEquals(fragment.createSplitInstallManager(), fragment.createSplitInstallManager())
     }
+
+    @Test
+    public fun create_noArgs() {
+        val fragment = DynamicNavHostFragment.create(R.id.nav_host)
+        assertEquals(fragment.arguments!!.size(), 1)
+    }
+
+    @Test
+    public fun create_withArgs() {
+        val fragment = DynamicNavHostFragment.create(
+            R.id.nav_host,
+            Bundle().apply {
+                putInt("Test", 1)
+            }
+        )
+        assertEquals(fragment.arguments!!.size(), 2)
+    }
 }
 
-class NavigationActivity : FragmentActivity() {
+public class NavigationActivity : FragmentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         setContentView(R.layout.dynamic_activity_layout)
         super.onCreate(savedInstanceState)
     }
 }
 
-class TestDynamicNavHostFragment : DynamicNavHostFragment() {
-    public override fun createSplitInstallManager() = super.createSplitInstallManager()
+public class TestDynamicNavHostFragment : DynamicNavHostFragment() {
+    public override fun createSplitInstallManager(): SplitInstallManager =
+        super.createSplitInstallManager()
 }
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt
index 35b8ac7..b062ef3 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/DynamicNavHostFragment.kt
@@ -16,6 +16,8 @@
 
 package androidx.navigation.dynamicfeatures.fragment
 
+import android.os.Bundle
+import androidx.annotation.NavigationRes
 import androidx.navigation.NavHostController
 import androidx.navigation.dynamicfeatures.DynamicActivityNavigator
 import androidx.navigation.dynamicfeatures.DynamicGraphNavigator
@@ -69,4 +71,35 @@
      */
     protected open fun createSplitInstallManager(): SplitInstallManager =
         SplitInstallManagerFactory.create(requireContext())
+
+    /** Companion object for DynamicNavHostFragment */
+    public companion object {
+
+        /**
+         * Create a new [DynamicNavHostFragment] instance with an inflated {@link NavGraph} resource.
+         *
+         * @param graphResId Resource id of the navigation graph to inflate.
+         * @param startDestinationArgs Arguments to send to the start destination of the graph.
+         * @return A new DynamicNavHostFragment instance.
+         */
+        @JvmStatic
+        @JvmOverloads
+        public fun create(
+            @NavigationRes graphResId: Int,
+            startDestinationArgs: Bundle? = null
+        ): DynamicNavHostFragment {
+            return DynamicNavHostFragment().apply {
+                arguments = if (graphResId != 0 || startDestinationArgs != null) {
+                    Bundle().apply {
+                        if (graphResId != 0) {
+                            putInt(KEY_GRAPH_ID, graphResId)
+                        }
+                        if (startDestinationArgs != null) {
+                            putBundle(KEY_START_DESTINATION_ARGS, startDestinationArgs)
+                        }
+                    }
+                } else null
+            }
+        }
+    }
 }
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/ui/DefaultProgressFragment.kt b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/ui/DefaultProgressFragment.kt
index ff2888c..5a2754d 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/ui/DefaultProgressFragment.kt
+++ b/navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/ui/DefaultProgressFragment.kt
@@ -51,6 +51,7 @@
     private var action: Button? = null
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
         with(view) {
             title = findViewById(R.id.progress_title)
             progressBar = findViewById(R.id.installation_progress)
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
index 2d0bbea..e76bed7 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
@@ -31,6 +31,7 @@
 import androidx.annotation.NavigationRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentContainerView;
@@ -80,8 +81,12 @@
  * coupling to the navigation host.</p>
  */
 public class NavHostFragment extends Fragment implements NavHost {
-    private static final String KEY_GRAPH_ID = "android-support-nav:fragment:graphId";
-    private static final String KEY_START_DESTINATION_ARGS =
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    protected static final String KEY_GRAPH_ID = "android-support-nav:fragment:graphId";
+    /** @hide */
+    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+    protected static final String KEY_START_DESTINATION_ARGS =
             "android-support-nav:fragment:startDestinationArgs";
     private static final String KEY_NAV_CONTROLLER_STATE =
             "android-support-nav:fragment:navControllerState";
@@ -156,9 +161,9 @@
     /**
      * Create a new NavHostFragment instance with an inflated {@link NavGraph} resource.
      *
-     * @param graphResId resource id of the navigation graph to inflate
-     * @param startDestinationArgs arguments to send to the start destination of the graph
-     * @return a new NavHostFragment instance
+     * @param graphResId Resource id of the navigation graph to inflate.
+     * @param startDestinationArgs Arguments to send to the start destination of the graph.
+     * @return A new NavHostFragment instance.
      */
     @NonNull
     public static NavHostFragment create(@NavigationRes int graphResId,
diff --git a/paging/common/src/main/kotlin/androidx/paging/CachedPagingData.kt b/paging/common/src/main/kotlin/androidx/paging/CachedPagingData.kt
index 630c588..c6c813a 100644
--- a/paging/common/src/main/kotlin/androidx/paging/CachedPagingData.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/CachedPagingData.kt
@@ -22,13 +22,11 @@
 import androidx.paging.ActiveFlowTracker.FlowType.PAGE_EVENT_FLOW
 import androidx.paging.multicast.Multicaster
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.mapNotNull
 import kotlinx.coroutines.flow.onCompletion
+import kotlinx.coroutines.flow.onEach
 import kotlinx.coroutines.flow.onStart
-import kotlinx.coroutines.flow.scan
 
 private class MulticastedPagingData<T : Any>(
     val scope: CoroutineScope,
@@ -82,22 +80,25 @@
     scope: CoroutineScope
 ) = cachedIn(scope, null)
 
-@OptIn(ExperimentalCoroutinesApi::class)
 internal fun <T : Any> Flow<PagingData<T>>.cachedIn(
     scope: CoroutineScope,
     // used in tests
     tracker: ActiveFlowTracker? = null
 ): Flow<PagingData<T>> {
+    // This variable is a replacement for lack of non-experimental `scan` operator.
+    // It holds onto the previous MulticastedPagingData to be able to close it when a new
+    // MulticastedPagingData is received.
+    var prev: MulticastedPagingData<T>? = null
     val multicastedFlow = this.map {
         MulticastedPagingData(
             scope = scope,
             parent = it
         )
-    }.scan(null as MulticastedPagingData<T>?) { prev, next ->
+    }.onEach {
         prev?.close()
-        next
-    }.mapNotNull {
-        it?.asPagingData()
+        prev = it
+    }.map {
+        it.asPagingData()
     }.onStart {
         tracker?.onStart(PAGED_DATA_FLOW)
     }.onCompletion {
@@ -124,4 +125,4 @@
         PAGED_DATA_FLOW,
         PAGE_EVENT_FLOW
     }
-}
\ No newline at end of file
+}
diff --git a/paging/common/src/main/kotlin/androidx/paging/multicast/StoreRealActor.kt b/paging/common/src/main/kotlin/androidx/paging/multicast/StoreRealActor.kt
index ce499c7..74c7fc1 100644
--- a/paging/common/src/main/kotlin/androidx/paging/multicast/StoreRealActor.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/multicast/StoreRealActor.kt
@@ -17,9 +17,11 @@
 
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.ObsoleteCoroutinesApi
-import kotlinx.coroutines.channels.SendChannel
-import kotlinx.coroutines.channels.actor
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.flow.consumeAsFlow
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onCompletion
+import kotlinx.coroutines.flow.onEach
 import java.util.concurrent.atomic.AtomicBoolean
 
 /**
@@ -29,29 +31,23 @@
 internal abstract class StoreRealActor<T>(
     scope: CoroutineScope
 ) {
-    private val inboundChannel: SendChannel<Any?>
+    private val inboundChannel = Channel<Any?>(capacity = Channel.RENDEZVOUS)
     private val closeCompleted = CompletableDeferred<Unit>()
     private val didClose = AtomicBoolean(false)
 
     init {
-        @OptIn(ObsoleteCoroutinesApi::class)
-        inboundChannel = scope.actor(
-            capacity = 0
-        ) {
-            try {
-                for (msg in channel) {
-                    if (msg === CLOSE_TOKEN) {
-                        doClose()
-                        break
-                    } else {
-                        @Suppress("UNCHECKED_CAST")
-                        handle(msg as T)
-                    }
+        inboundChannel.consumeAsFlow()
+            .onEach { msg ->
+                if (msg === CLOSE_TOKEN) {
+                    doClose()
+                } else {
+                    @Suppress("UNCHECKED_CAST")
+                    handle(msg as T)
                 }
-            } finally {
+            }.onCompletion {
                 doClose()
             }
-        }
+            .launchIn(scope)
     }
 
     private fun doClose() {
diff --git a/recyclerview/README.md b/recyclerview/README.md
index 6648c7b..71fb426 100644
--- a/recyclerview/README.md
+++ b/recyclerview/README.md
@@ -6,7 +6,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/recyclerview)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/recyclerview/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/recyclerview/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/classes.html)
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
index 291bd76..9d0d99b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
@@ -60,7 +60,7 @@
             ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_ENTITY_FIELDS
         )
 
-        val adapter = context.typeAdapterStore.findColumnTypeAdapter(member, affinity)
+        val adapter = context.typeAdapterStore.findColumnTypeAdapter(member, affinity, false)
         val adapterAffinity = adapter?.typeAffinity ?: affinity
         val nonNull = Field.calcNonNull(member, fieldParent)
 
diff --git a/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt b/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
index f04871d..4196bae 100644
--- a/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
@@ -260,7 +260,7 @@
         if (output.isError()) {
             return null
         }
-        val adapter = findColumnTypeAdapter(output, affinity)
+        val adapter = findColumnTypeAdapter(output, affinity, true)
         if (adapter != null) {
             // two way is better
             return adapter
@@ -314,7 +314,11 @@
      * Finds a two way converter, if you need 1 way, use findStatementValueBinder or
      * findCursorValueReader.
      */
-    fun findColumnTypeAdapter(out: XType, affinity: SQLTypeAffinity?): ColumnTypeAdapter? {
+    fun findColumnTypeAdapter(
+        out: XType,
+        affinity: SQLTypeAffinity?,
+        skipEnumConverter: Boolean
+    ): ColumnTypeAdapter? {
         if (out.isError()) {
             return null
         }
@@ -338,9 +342,11 @@
         if (adapterByTypeConverter != null) {
             return adapterByTypeConverter
         }
-        val enumAdapter = createEnumTypeAdapter(out)
-        if (enumAdapter != null) {
-            return enumAdapter
+        if (!skipEnumConverter) {
+            val enumAdapter = createEnumTypeAdapter(out)
+            if (enumAdapter != null) {
+                return enumAdapter
+            }
         }
         return null
     }
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
index 4096f31..704310f 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
@@ -105,7 +105,7 @@
     fun bind() {
         simpleRun { invocation ->
             val adapter = TypeAdapterStore.create(Context(invocation.processingEnv))
-                .findColumnTypeAdapter(input.getTypeMirror(invocation.processingEnv), null)!!
+                .findColumnTypeAdapter(input.getTypeMirror(invocation.processingEnv), null, false)!!
             adapter.bindToStmt("st", "6", "inp", scope)
             assertThat(scope.generate().toString().trim(), `is`(bindCode))
             generateCode(invocation, false)
@@ -120,7 +120,7 @@
         simpleRun { invocation ->
             val adapter = TypeAdapterStore.create(Context(invocation.processingEnv))
                 .findColumnTypeAdapter(
-                    input.getBoxedTypeMirror(invocation.processingEnv), null
+                    input.getBoxedTypeMirror(invocation.processingEnv), null, false
                 )!!
             adapter.bindToStmt("st", "6", "inp", scope)
             assertThat(
@@ -162,7 +162,7 @@
     fun read() {
         simpleRun { invocation ->
             val adapter = TypeAdapterStore.create(Context(invocation.processingEnv))
-                .findColumnTypeAdapter(input.getTypeMirror(invocation.processingEnv), null)!!
+                .findColumnTypeAdapter(input.getTypeMirror(invocation.processingEnv), null, false)!!
             adapter.readFromCursor("out", "crs", "9", scope)
             assertThat(scope.generate().toString().trim(), `is`(cursorCode))
             generateCode(invocation, false)
@@ -177,7 +177,7 @@
         simpleRun { invocation ->
             val adapter = TypeAdapterStore.create(Context(invocation.processingEnv))
                 .findColumnTypeAdapter(
-                    input.getBoxedTypeMirror(invocation.processingEnv), null
+                    input.getBoxedTypeMirror(invocation.processingEnv), null, false
                 )!!
             adapter.readFromCursor("out", "crs", "9", scope)
             assertThat(
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
index ab48fa7a..3b8ff54 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
@@ -20,7 +20,6 @@
 import androidx.paging.DataSource
 import androidx.paging.PagingSource
 import androidx.room.compiler.processing.XProcessingEnv
-import androidx.room.compiler.processing.asDeclaredType
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.compiler.processing.util.runProcessorTest
@@ -73,7 +72,7 @@
         runProcessorTest { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
             val primitiveType = invocation.processingEnv.requireType(TypeName.INT)
-            val adapter = store.findColumnTypeAdapter(primitiveType, null)
+            val adapter = store.findColumnTypeAdapter(primitiveType, null, false)
             assertThat(adapter, notNullValue())
         }
     }
@@ -88,7 +87,7 @@
                 .processingEnv
                 .requireType("java.lang.Boolean")
                 .makeNullable()
-            val adapter = store.findColumnTypeAdapter(boolean, null)
+            val adapter = store.findColumnTypeAdapter(boolean, null, false)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
             val composite = adapter as CompositeAdapter
@@ -122,7 +121,7 @@
             val enum = invocation
                 .processingEnv
                 .requireType("foo.bar.Fruit")
-            val adapter = store.findColumnTypeAdapter(enum, null)
+            val adapter = store.findColumnTypeAdapter(enum, null, false)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(EnumColumnTypeAdapter::class.java))
         }
@@ -133,7 +132,7 @@
         runProcessorTest { invocation ->
             val store = TypeAdapterStore.create(Context(invocation.processingEnv))
             val booleanType = invocation.processingEnv.requireType(TypeName.BOOLEAN)
-            val adapter = store.findColumnTypeAdapter(booleanType, null)
+            val adapter = store.findColumnTypeAdapter(booleanType, null, false)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
             val bindScope = testCodeGenScope()
@@ -195,7 +194,7 @@
                 pointTypeConverters(invocation.processingEnv)
             )
             val pointType = invocation.processingEnv.requireType("foo.bar.Point")
-            val adapter = store.findColumnTypeAdapter(pointType, null)
+            val adapter = store.findColumnTypeAdapter(pointType, null, false)
             assertThat(adapter, notNullValue())
             assertThat(adapter, instanceOf(CompositeAdapter::class.java))
 
@@ -270,7 +269,7 @@
                 binders[1]
             )
 
-            val adapter = store.findColumnTypeAdapter(binders[0].from, null)
+            val adapter = store.findColumnTypeAdapter(binders[0].from, null, false)
             assertThat(adapter, notNullValue())
 
             val bindScope = testCodeGenScope()
@@ -304,7 +303,7 @@
         runProcessorTest { invocation ->
             val binders = createIntListToStringBinders(invocation)
             val store = TypeAdapterStore.create(Context(invocation.processingEnv), binders[0])
-            val adapter = store.findColumnTypeAdapter(binders[0].from, null)
+            val adapter = store.findColumnTypeAdapter(binders[0].from, null, false)
             assertThat(adapter, nullValue())
 
             val stmtBinder = store.findStatementValueBinder(binders[0].from, null)
@@ -588,7 +587,7 @@
             assertThat(pagingSourceIntIntType, notNullValue())
             assertThat(
                 PagingSourceQueryResultBinderProvider(invocation.context)
-                    .matches(pagingSourceIntIntType.asDeclaredType()),
+                    .matches(pagingSourceIntIntType),
                 `is`(true)
             )
         }
@@ -606,7 +605,7 @@
             assertThat(pagingSourceIntIntType, notNullValue())
             assertThat(
                 PagingSourceQueryResultBinderProvider(invocation.context)
-                    .matches(pagingSourceIntIntType.asDeclaredType()),
+                    .matches(pagingSourceIntIntType),
                 `is`(true)
             )
             invocation.assertCompilationResult {
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EnumColumnTypeAdapterTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EnumColumnTypeAdapterTest.java
index 94cccaf..13b47e4 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EnumColumnTypeAdapterTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/EnumColumnTypeAdapterTest.java
@@ -29,10 +29,13 @@
 import androidx.room.Query;
 import androidx.room.Room;
 import androidx.room.RoomDatabase;
+import androidx.room.TypeConverter;
+import androidx.room.TypeConverters;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -42,7 +45,6 @@
 public class EnumColumnTypeAdapterTest {
 
     private EnumColumnTypeAdapterDatabase mDb;
-    private EnumColumnTypeAdapterDatabase mDbComplex;
 
     @Entity
     public static class EntityWithEnum {
@@ -50,6 +52,14 @@
         public Long id;
         public Fruit fruit;
     }
+
+    @Entity
+    public static class EntityWithOneWayEnum {
+        @PrimaryKey
+        public Long id;
+        public Color color;
+    }
+
     @Entity
     public static class ComplexEntityWithEnum {
         @PrimaryKey
@@ -57,6 +67,11 @@
         public Season mSeason;
     }
 
+    public enum Color {
+        RED,
+        GREEN
+    }
+
     public enum Fruit {
         BANANA,
         STRAWBERRY,
@@ -86,6 +101,26 @@
     }
 
     @Dao
+    public interface SampleDaoWithOneWayConverter {
+        @Query("INSERT INTO EntityWithOneWayEnum (id, color) VALUES (:id, :colorInt)")
+        long insert(long id, int colorInt);
+
+        @Query("SELECT * FROM EntityWithOneWayEnum WHERE id = :id")
+        EntityWithOneWayEnum getValueWithId(long id);
+    }
+
+    public static class ColorTypeConverter {
+        @TypeConverter
+        public Color fromIntToColorEnum(int colorInt) {
+            if (colorInt == 1) {
+                return Color.RED;
+            } else {
+                return Color.GREEN;
+            }
+        }
+    }
+
+    @Dao
     public interface SampleDaoWithComplexEnum {
         @Query("INSERT INTO ComplexEntityWithEnum (id, mSeason) VALUES (:id, :season)")
         long insertComplex(long id, Season season);
@@ -94,10 +129,13 @@
         ComplexEntityWithEnum getComplexValueWithId(long id);
     }
 
-    @Database(entities = {EntityWithEnum.class, ComplexEntityWithEnum.class}, version = 1,
+    @Database(entities = {EntityWithEnum.class, ComplexEntityWithEnum.class,
+            EntityWithOneWayEnum.class}, version = 1,
             exportSchema = false)
+    @TypeConverters(ColorTypeConverter.class)
     public abstract static class EnumColumnTypeAdapterDatabase extends RoomDatabase {
         public abstract EnumColumnTypeAdapterTest.SampleDao dao();
+        public abstract EnumColumnTypeAdapterTest.SampleDaoWithOneWayConverter oneWayDao();
         public abstract EnumColumnTypeAdapterTest.SampleDaoWithComplexEnum complexDao();
     }
 
@@ -108,10 +146,11 @@
                 context,
                 EnumColumnTypeAdapterDatabase.class)
                 .build();
-        mDbComplex = Room.inMemoryDatabaseBuilder(
-                context,
-                EnumColumnTypeAdapterDatabase.class)
-                .build();
+    }
+
+    @After
+    public void teardown() {
+        mDb.close();
     }
 
     @Test
@@ -124,9 +163,16 @@
     }
 
     @Test
+    public void writeOneWayEnumToDatabase() {
+        final long id2 = mDb.oneWayDao().insert(1, 1);
+        assertThat(mDb.oneWayDao().getValueWithId(1).color, is(equalTo(Color.RED)));
+
+    }
+
+    @Test
     public void filterOutComplexEnumTest() {
-        final long id1 = mDbComplex.complexDao().insertComplex(1, Season.AUTUMN);
-        assertThat(mDbComplex.complexDao().getComplexValueWithId(1).mSeason,
+        final long id1 = mDb.complexDao().insertComplex(1, Season.AUTUMN);
+        assertThat(mDb.complexDao().getComplexValueWithId(1).mSeason,
                 is(equalTo(Season.AUTUMN)));
     }
 }
diff --git a/room/runtime/build.gradle b/room/runtime/build.gradle
index 0a0769d..fbce4b2 100644
--- a/room/runtime/build.gradle
+++ b/room/runtime/build.gradle
@@ -55,8 +55,12 @@
     androidTestImplementation(ANDROIDX_TEST_CORE)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(ESPRESSO_CORE)
+    androidTestImplementation(KOTLIN_STDLIB)
     androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
+    androidTestImplementation(project(":internal-testutils-truth")) // for assertThrows
+    androidTestImplementation("androidx.arch.core:core-testing:2.0.1")
+
 }
 
 android.libraryVariants.all { variant ->
diff --git a/room/runtime/src/androidTest/java/androidx/room/AutoCloserTest.kt b/room/runtime/src/androidTest/java/androidx/room/AutoCloserTest.kt
new file mode 100644
index 0000000..87e9c17
--- /dev/null
+++ b/room/runtime/src/androidTest/java/androidx/room/AutoCloserTest.kt
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.room
+
+import androidx.arch.core.executor.ArchTaskExecutor
+import androidx.arch.core.executor.testing.CountingTaskExecutorRule
+import androidx.sqlite.db.SupportSQLiteDatabase
+import androidx.sqlite.db.SupportSQLiteOpenHelper
+import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.testutils.assertThrows
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.io.IOException
+import java.util.concurrent.TimeUnit
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+public class AutoCloserTest {
+
+    @get:Rule
+    public val countingTaskExecutorRule: CountingTaskExecutorRule = CountingTaskExecutorRule()
+
+    private lateinit var autoCloser: AutoCloser
+
+    private lateinit var callback: Callback
+
+    private class Callback(var throwOnOpen: Boolean = false) :
+        SupportSQLiteOpenHelper.Callback(1) {
+        override fun onCreate(db: SupportSQLiteDatabase) {}
+
+        override fun onOpen(db: SupportSQLiteDatabase) {
+            if (throwOnOpen) {
+                throw IOException()
+            }
+        }
+
+        override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) {}
+    }
+
+    @Before
+    public fun setUp() {
+        callback = Callback()
+
+        val delegateOpenHelper = FrameworkSQLiteOpenHelperFactory()
+            .create(
+                SupportSQLiteOpenHelper.Configuration
+                    .builder(ApplicationProvider.getApplicationContext())
+                    .callback(callback)
+                    .name("name")
+                    .build()
+            )
+
+        val autoCloseExecutor = ArchTaskExecutor.getIOThreadExecutor()
+
+        autoCloser = AutoCloser(
+            1,
+            TimeUnit.MILLISECONDS,
+            autoCloseExecutor
+        ).also {
+            it.init(delegateOpenHelper)
+        }
+    }
+
+    @After
+    public fun cleanUp() {
+        assertThat(countingTaskExecutorRule.isIdle).isTrue()
+    }
+
+    @Test
+    public fun refCountsCounted() {
+        autoCloser.incrementCountAndEnsureDbIsOpen()
+        assertThat(autoCloser.refCountForTest).isEqualTo(1)
+
+        autoCloser.incrementCountAndEnsureDbIsOpen()
+        assertThat(autoCloser.refCountForTest).isEqualTo(2)
+
+        autoCloser.decrementCountAndScheduleClose()
+        assertThat(autoCloser.refCountForTest).isEqualTo(1)
+
+        autoCloser.executeRefCountingFunction {
+            assertThat(autoCloser.refCountForTest).isEqualTo(2)
+        }
+        assertThat(autoCloser.refCountForTest).isEqualTo(1)
+
+        autoCloser.decrementCountAndScheduleClose()
+        assertThat(autoCloser.refCountForTest).isEqualTo(0)
+
+        // TODO(rohitsat): remove these sleeps and add a hook in AutoCloser to confirm that the
+        // scheduled tasks are done.
+        Thread.sleep(5)
+        countingTaskExecutorRule.drainTasks(10, TimeUnit.MILLISECONDS)
+    }
+
+    @Test
+    public fun executeRefCountingFunctionPropagatesFailure() {
+        assertThrows<IOException> {
+            autoCloser.executeRefCountingFunction {
+                throw IOException()
+            }
+        }
+
+        assertThat(autoCloser.refCountForTest).isEqualTo(0)
+
+        // TODO(rohitsat): remove these sleeps and add a hook in AutoCloser to confirm that the
+        // scheduled tasks are done.
+        Thread.sleep(5)
+        countingTaskExecutorRule.drainTasks(10, TimeUnit.MILLISECONDS)
+    }
+
+    @Test
+    public fun dbNotClosedWithRefCountIncremented() {
+        autoCloser.incrementCountAndEnsureDbIsOpen()
+
+        Thread.sleep(10)
+
+        assertThat(autoCloser.delegateDatabase!!.isOpen).isTrue()
+
+        autoCloser.decrementCountAndScheduleClose()
+
+        // TODO(rohitsat): remove these sleeps and add a hook in AutoCloser to confirm that the
+        // scheduled tasks are done.
+        Thread.sleep(10)
+        assertThat(autoCloser.delegateDatabase).isNull()
+    }
+
+    @Test
+    public fun getDelegatedDatabaseReturnsUnwrappedDatabase() {
+        assertThat(autoCloser.delegateDatabase).isNull()
+
+        val db = autoCloser.incrementCountAndEnsureDbIsOpen()
+        db.beginTransaction()
+        // Beginning a transaction on the unwrapped db shouldn't increment our ref count.
+        assertThat(autoCloser.refCountForTest).isEqualTo(1)
+        db.endTransaction()
+
+        autoCloser.delegateDatabase!!.beginTransaction()
+        assertThat(autoCloser.refCountForTest).isEqualTo(1)
+        autoCloser.delegateDatabase!!.endTransaction()
+        autoCloser.decrementCountAndScheduleClose()
+
+        autoCloser.executeRefCountingFunction {
+            assertThat(autoCloser.refCountForTest).isEqualTo(1)
+        }
+
+        // TODO(rohitsat): remove these sleeps and add a hook in AutoCloser to confirm that the
+        // scheduled tasks are done.
+        Thread.sleep(5)
+        countingTaskExecutorRule.drainTasks(10, TimeUnit.MILLISECONDS)
+    }
+
+    @Test
+    public fun refCountStaysIncrementedWhenErrorIsEncountered() {
+        callback.throwOnOpen = true
+        assertThrows<IOException> {
+            autoCloser.incrementCountAndEnsureDbIsOpen()
+        }
+
+        assertThat(autoCloser.refCountForTest).isEqualTo(1)
+
+        autoCloser.decrementCountAndScheduleClose()
+        callback.throwOnOpen = false
+
+        // TODO(rohitsat): remove these sleeps and add a hook in AutoCloser to confirm that the
+        // scheduled tasks are done.
+        Thread.sleep(5)
+        countingTaskExecutorRule.drainTasks(10, TimeUnit.MILLISECONDS)
+    }
+}
\ No newline at end of file
diff --git a/room/runtime/src/main/java/androidx/room/AutoCloser.java b/room/runtime/src/main/java/androidx/room/AutoCloser.java
new file mode 100644
index 0000000..eda2363
--- /dev/null
+++ b/room/runtime/src/main/java/androidx/room/AutoCloser.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.room;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.util.Log;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.arch.core.util.Function;
+import androidx.room.util.SneakyThrow;
+import androidx.sqlite.db.SupportSQLiteDatabase;
+import androidx.sqlite.db.SupportSQLiteOpenHelper;
+
+import java.io.IOException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * AutoCloser is responsible for automatically opening (using
+ * delegateOpenHelper) and closing (on a timer started when there are no remaining references) a
+ * SupportSqliteDatabase.
+ *
+ * It is important to ensure that the ref count is incremented when using a returned database.
+ */
+final class AutoCloser {
+
+    @Nullable
+    private SupportSQLiteOpenHelper mDelegateOpenHelper = null;
+
+    @NonNull
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+    // Package private for access from mAutoCloser
+    @NonNull
+    final Object mLock = new Object();
+
+    // Package private for access from mAutoCloser
+    final long mAutoCloseTimeoutInMs;
+
+    // Package private for access from mExecuteAutoCloser
+    @NonNull
+    final Executor mExecutor;
+
+    // Package private for access from mAutoCloser
+    @GuardedBy("mLock")
+    int mRefCount = 0;
+
+    // Package private for access from mAutoCloser
+    @GuardedBy("mLock")
+    long mLastDecrementRefCountTimeStamp = SystemClock.uptimeMillis();
+
+    // The unwrapped SupportSqliteDatabase
+    // Package private for access from mAutoCloser
+    @GuardedBy("mLock")
+    @Nullable
+    SupportSQLiteDatabase mDelegateDatabase;
+
+    private final Runnable mExecuteAutoCloser = new Runnable() {
+        @Override
+        public void run() {
+            mExecutor.execute(mAutoCloser);
+        }
+    };
+
+    // Package private for access from mExecuteAutoCloser
+    @NonNull
+    final Runnable mAutoCloser = new Runnable() {
+        @Override
+        public void run() {
+            synchronized (mLock) {
+                if (SystemClock.uptimeMillis() - mLastDecrementRefCountTimeStamp
+                        < mAutoCloseTimeoutInMs) {
+                    // An increment + decrement beat us to closing the db. We
+                    // will not close the database, and there should be at least
+                    // one more auto-close scheduled.
+                    return;
+                }
+
+                if (mRefCount != 0) {
+                    // An increment beat us to closing the db. We don't close the
+                    // db, and another closer will be scheduled once the ref
+                    // count is decremented.
+                    return;
+                }
+
+                if (mDelegateDatabase != null) {
+                    try {
+                        mDelegateDatabase.close();
+                    } catch (IOException e) {
+                        SneakyThrow.reThrow(e);
+                    }
+                    mDelegateDatabase = null;
+                }
+            }
+        }
+    };
+
+
+    /**
+     * Construct an AutoCloser.
+     *
+     * @param autoCloseTimeoutAmount time for auto close timer
+     * @param autoCloseTimeUnit      time unit for autoCloseTimeoutAmount
+     * @param autoCloseExecutor      the executor on which the auto close operation will happen
+     */
+    AutoCloser(long autoCloseTimeoutAmount,
+            @NonNull TimeUnit autoCloseTimeUnit,
+            @NonNull Executor autoCloseExecutor) {
+        mAutoCloseTimeoutInMs = autoCloseTimeUnit.toMillis(autoCloseTimeoutAmount);
+        mExecutor = autoCloseExecutor;
+    }
+
+    /**
+     * Since we need to construct the AutoCloser in the RoomDatabase.Builder, we need to set the
+     * delegateOpenHelper after construction.
+     *
+     * @param delegateOpenHelper the open helper that is used to create
+     *                           new SupportSqliteDatabases
+     */
+    public void init(@NonNull SupportSQLiteOpenHelper delegateOpenHelper) {
+        if (mDelegateOpenHelper != null) {
+            Log.e(Room.LOG_TAG, "AutoCloser initialized multiple times. This is probably a bug in"
+                    + " the room code.");
+            return;
+        }
+        this.mDelegateOpenHelper = delegateOpenHelper;
+    }
+
+    /**
+     * Execute a ref counting function. The function will receive an unwrapped open database and
+     * this database will stay open until at least after function returns. If there are no more
+     * references in use for the db once function completes, an auto close operation will be
+     * scheduled.
+     */
+    @Nullable
+    public <V> V executeRefCountingFunction(@NonNull Function<SupportSQLiteDatabase, V> function) {
+        try {
+            SupportSQLiteDatabase db = incrementCountAndEnsureDbIsOpen();
+            return function.apply(db);
+        } finally {
+            decrementCountAndScheduleClose();
+        }
+    }
+
+    /**
+     * Confirms that autoCloser is no longer running and confirms that mDelegateDatabase is set
+     * and open. mDelegateDatabase will not be auto closed until
+     * decrementRefCountAndScheduleClose is called. decrementRefCountAndScheduleClose must be
+     * called once for each call to incrementCountAndEnsureDbIsOpen.
+     *
+     * If this throws an exception, decrementCountAndScheduleClose must still be called!
+     *
+     * @return the *unwrapped* SupportSQLiteDatabase.
+     */
+    @NonNull
+    public SupportSQLiteDatabase incrementCountAndEnsureDbIsOpen() {
+        //TODO(rohitsat): avoid synchronized(mLock) when possible. We should be able to avoid it
+        // when refCount is not hitting zero or if there is no auto close scheduled if we use
+        // Atomics.
+        synchronized (mLock) {
+            // If there is a scheduled autoclose operation, we should remove it from the handler.
+            mHandler.removeCallbacks(mExecuteAutoCloser);
+
+            mRefCount++;
+
+            if (mDelegateDatabase != null && mDelegateDatabase.isOpen()) {
+                return mDelegateDatabase;
+            } else if (mDelegateDatabase != null) {
+                // This shouldn't happen
+                throw new IllegalStateException("mDelegateDatabase is closed but non-null");
+            }
+
+            // Get the database while holding `mLock` so no other threads try to create it or
+            // destroy it.
+            if (mDelegateOpenHelper != null) {
+                mDelegateDatabase = mDelegateOpenHelper.getWritableDatabase();
+            } else {
+                throw new IllegalStateException("AutoCloser has not beeninitialized. This "
+                        + "shouldn't happen, but if it does it means there's a bug in our code");
+            }
+
+            return mDelegateDatabase;
+        }
+    }
+
+    /**
+     * Decrements the ref count and schedules a close if there are no other references to the db.
+     * This must only be called after a corresponding incrementCountAndEnsureDbIsOpen call.
+     */
+    public void decrementCountAndScheduleClose() {
+        //TODO(rohitsat): avoid synchronized(mLock) when possible
+        synchronized (mLock) {
+            if (mRefCount <= 0) {
+                throw new IllegalStateException("ref count is 0 or lower but we're supposed to "
+                        + "decrement");
+            }
+
+            // decrement refCount
+            mRefCount--;
+
+            // if refcount is zero, schedule close operation
+            if (mRefCount == 0) {
+                if (mDelegateDatabase == null) {
+                    // No db to close, this can happen due to exceptions when creating db...
+                    return;
+                }
+                mHandler.postDelayed(mExecuteAutoCloser, mAutoCloseTimeoutInMs);
+            }
+        }
+    }
+
+    /**
+     * Returns the underlying database. This does not ensure that the database is open; the
+     * caller is responsible for ensuring that the database is open and the ref count is non-zero.
+     *
+     * This is primarily meant for use cases where we don't want to open the database (isOpen) or
+     * we know that the database is already open (KeepAliveCursor).
+     */
+    @Nullable // Since the db might be closed
+    public SupportSQLiteDatabase getDelegateDatabase() {
+        synchronized (mLock) {
+            return mDelegateDatabase;
+        }
+    }
+
+    /**
+     * Returns the current ref count for this auto closer. This is only visible for testing.
+     *
+     * @return current ref count
+     */
+    @VisibleForTesting
+    public int getRefCountForTest() {
+        synchronized (mLock) {
+            return mRefCount;
+        }
+    }
+}
diff --git a/room/settings.gradle b/room/settings.gradle
index 37a197fa..6b6675b 100644
--- a/room/settings.gradle
+++ b/room/settings.gradle
@@ -21,5 +21,6 @@
 selectProjectsFromAndroidX({ name ->
     if (name.startsWith(":room")) return true
     if (name.startsWith(":sqlite") && !name.contains("inspection")) return true
+    if (name == ":internal-testutils-truth") return true
     return false
 })
diff --git a/transition/README.md b/transition/README.md
index 2e9a808..45f33c5 100644
--- a/transition/README.md
+++ b/transition/README.md
@@ -6,7 +6,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/transition)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/transition/)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/transition/)
 
 [Reference documentation](https://developer.android.com/reference/androidx/transition/package-summary)
 
diff --git a/webkit/README.md b/webkit/README.md
index 2c7ae98..dedcbe1 100644
--- a/webkit/README.md
+++ b/webkit/README.md
@@ -1,7 +1,7 @@
 # androidx.webkit
 
 **See this page rendered in [Gitiles
-markdown](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/webkit/README.md).**
+markdown](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/webkit/README.md).**
 
 The androidx.webkit library is a static library you can add to your Android
 application in order to use android.webkit APIs that are not available for older
@@ -11,7 +11,7 @@
 
 * [Library owners](OWNERS)
 * [Release notes](https://developer.android.com/jetpack/androidx/releases/webkit)
-* [Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/webkit/)
+* [Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/webkit/)
 * [Reference docs and guide to import the library](https://developer.android.com/reference/androidx/webkit/package-summary)
 * [Existing open bugs](https://issuetracker.google.com/issues?q=componentid:460423%20status:open)
 * [File a new bug](https://issuetracker.google.com/issues/new?component=460423)
diff --git a/webkit/integration-tests/testapp/README.md b/webkit/integration-tests/testapp/README.md
index 4c7d56c..335af43 100644
--- a/webkit/integration-tests/testapp/README.md
+++ b/webkit/integration-tests/testapp/README.md
@@ -1,7 +1,7 @@
 # WebView Demo App
 
 **See this page rendered in [Gitiles
-markdown](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/webkit/integration-tests/testapp/README.md).**
+markdown](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/webkit/integration-tests/testapp/README.md).**
 
 The WebView/Webkit demo app serves as both a practical demonstration how to use
 the latest AndroidX Webkit APIs and as a means to exercise those APIs for manual
diff --git a/work/README.md b/work/README.md
index faa3127..17860ca 100644
--- a/work/README.md
+++ b/work/README.md
@@ -8,7 +8,7 @@
 
 [Release notes](https://developer.android.com/jetpack/androidx/releases/work)
 
-[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/work)
+[Browse source](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/work)
 
 [Reference documentation](https://developer.android.com/reference/androidx/work/package-summary)
 
@@ -16,4 +16,4 @@
 
 [File a new bug](https://issuetracker.google.com/issues/new?component=409906)
 
-[Contributing from GitHub](https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/CONTRIBUTING.md)
+[Contributing from GitHub](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/CONTRIBUTING.md)
diff --git a/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkInfoTest.kt b/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkInfoTest.kt
index f1d084b..26c2af0 100644
--- a/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkInfoTest.kt
+++ b/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkInfoTest.kt
@@ -30,7 +30,6 @@
 import androidx.work.inspection.worker.IdleWorker
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -56,7 +55,6 @@
             }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun addAndRemoveWork() = runBlocking {
         inspectWorkManager()
@@ -75,7 +73,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun sendWorkAddedEvent() = runBlocking {
         inspectWorkManager()
@@ -89,7 +86,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun updateWorkInfoState() = runBlocking {
         inspectWorkManager()
@@ -102,7 +98,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun updateWorkInfoRetryCount() = runBlocking {
         inspectWorkManager()
@@ -115,7 +110,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun updateWorkInfoOutputData() = runBlocking {
         inspectWorkManager()
@@ -135,7 +129,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun updateWorkInfoScheduleRequestedAt() = runBlocking {
         inspectWorkManager()
@@ -149,7 +142,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun runEntryHook_getCallStackWithWorkAddedEvent() = runBlocking {
         inspectWorkManager()
@@ -174,7 +166,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun addChainingWorkWithUniqueName() = runBlocking {
         inspectWorkManager()
@@ -203,7 +194,6 @@
         }
     }
 
-    @Ignore("b/172833278")
     @Test
     fun cancelWork() = runBlocking {
         inspectWorkManager()
diff --git a/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkManagerInspectorTestEnvironment.kt b/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkManagerInspectorTestEnvironment.kt
index 4a0f566..f60b1d2 100644
--- a/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkManagerInspectorTestEnvironment.kt
+++ b/work/workmanager-inspection/src/androidTest/java/androidx/work/inspection/WorkManagerInspectorTestEnvironment.kt
@@ -69,9 +69,9 @@
             workManager.cancelAllWork()
             workManager.pruneWork()
             application.executor.runAllCommands()
+            inspectorTester.dispose()
             job.cancelAndJoin()
         }
-        inspectorTester.dispose()
     }
 
     @OptIn(ExperimentalCoroutinesApi::class)
diff --git a/work/workmanager-inspection/src/main/java/androidx/work/inspection/WorkManagerInspector.kt b/work/workmanager-inspection/src/main/java/androidx/work/inspection/WorkManagerInspector.kt
index 6a41f13..1d63f91 100644
--- a/work/workmanager-inspection/src/main/java/androidx/work/inspection/WorkManagerInspector.kt
+++ b/work/workmanager-inspection/src/main/java/androidx/work/inspection/WorkManagerInspector.kt
@@ -42,6 +42,7 @@
 import androidx.work.inspection.WorkManagerInspectorProtocol.WorkRemovedEvent
 import androidx.work.inspection.WorkManagerInspectorProtocol.WorkUpdatedEvent
 import java.util.UUID
+import java.util.concurrent.CountDownLatch
 import java.util.concurrent.Executor
 
 /**
@@ -267,9 +268,14 @@
 
     override fun onDispose() {
         super.onDispose()
+        val latch = CountDownLatch(1)
         mainHandler.post {
             lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
+            latch.countDown()
         }
+        // await to make sure that all observers that registered by inspector are gone
+        // otherwise they can post message to "disposed" inspector
+        latch.await()
     }
 
     override fun getLifecycle(): Lifecycle {