Merge "Use fully qualified package name for media2-widget test resources" into androidx-master-dev
diff --git a/activity/activity-ktx/api/1.0.0.txt b/activity/activity-ktx/api/1.0.0.txt
new file mode 100644
index 0000000..c6e9a9a
--- /dev/null
+++ b/activity/activity-ktx/api/1.0.0.txt
@@ -0,0 +1,15 @@
+// Signature format: 3.0
+package androidx.activity {
+
+  public final class ActivityViewModelLazyKt {
+    ctor public ActivityViewModelLazyKt();
+    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> viewModels(androidx.activity.ComponentActivity, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+  }
+
+  public final class OnBackPressedDispatcherKt {
+    ctor public OnBackPressedDispatcherKt();
+    method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, androidx.lifecycle.LifecycleOwner? owner = null, boolean enabled = true, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
+  }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/activity/activity-ktx/api/res-1.0.0.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to activity/activity-ktx/api/res-1.0.0.txt
diff --git a/activity/activity-ktx/api/restricted_1.0.0.txt b/activity/activity-ktx/api/restricted_1.0.0.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/activity/activity-ktx/api/restricted_1.0.0.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/activity/activity-ktx/build.gradle b/activity/activity-ktx/build.gradle
index df50b6c..44d017f 100644
--- a/activity/activity-ktx/build.gradle
+++ b/activity/activity-ktx/build.gradle
@@ -35,7 +35,7 @@
 
 dependencies {
     api(project(":activity:activity"))
-    api("androidx.core:core-ktx:1.1.0-rc01") {
+    api("androidx.core:core-ktx:1.1.0") {
         because 'Mirror activity dependency graph for -ktx artifacts'
     }
     api(project(":lifecycle:lifecycle-runtime-ktx")) {
diff --git a/activity/activity/api/1.0.0.txt b/activity/activity/api/1.0.0.txt
new file mode 100644
index 0000000..9e0f44a
--- /dev/null
+++ b/activity/activity/api/1.0.0.txt
@@ -0,0 +1,37 @@
+// Signature format: 3.0
+package androidx.activity {
+
+  public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+    ctor public ComponentActivity();
+    ctor @ContentView public ComponentActivity(@LayoutRes int);
+    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
+    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
+    method public androidx.lifecycle.ViewModelStore getViewModelStore();
+    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+    method public final Object? onRetainNonConfigurationInstance();
+  }
+
+  public abstract class OnBackPressedCallback {
+    ctor public OnBackPressedCallback(boolean);
+    method @MainThread public abstract void handleOnBackPressed();
+    method @MainThread public final boolean isEnabled();
+    method @MainThread public final void remove();
+    method @MainThread public final void setEnabled(boolean);
+  }
+
+  public final class OnBackPressedDispatcher {
+    ctor public OnBackPressedDispatcher();
+    ctor public OnBackPressedDispatcher(Runnable?);
+    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback);
+    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner, androidx.activity.OnBackPressedCallback);
+    method @MainThread public boolean hasEnabledCallbacks();
+    method @MainThread public void onBackPressed();
+  }
+
+  public interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
+    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
+  }
+
+}
+
diff --git a/activity/activity/api/1.1.0-alpha03.txt b/activity/activity/api/1.1.0-alpha03.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/1.1.0-alpha03.txt
+++ b/activity/activity/api/1.1.0-alpha03.txt
@@ -6,7 +6,6 @@
     ctor @ContentView public ComponentActivity(@LayoutRes int);
     method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
     method @Deprecated public Object? getLastCustomNonConfigurationInstance();
-    method public androidx.lifecycle.Lifecycle getLifecycle();
     method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
     method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -6,7 +6,6 @@
     ctor @ContentView public ComponentActivity(@LayoutRes int);
     method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
     method @Deprecated public Object? getLastCustomNonConfigurationInstance();
-    method public androidx.lifecycle.Lifecycle getLifecycle();
     method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
     method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/biometric/api/res-1.0.0-beta01.txt b/activity/activity/api/res-1.0.0.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to activity/activity/api/res-1.0.0.txt
diff --git a/activity/activity/api/restricted_1.0.0.txt b/activity/activity/api/restricted_1.0.0.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/activity/activity/api/restricted_1.0.0.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/activity/activity/api/restricted_1.1.0-alpha03.txt b/activity/activity/api/restricted_1.1.0-alpha03.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/restricted_1.1.0-alpha03.txt
+++ b/activity/activity/api/restricted_1.1.0-alpha03.txt
@@ -6,7 +6,6 @@
     ctor @ContentView public ComponentActivity(@LayoutRes int);
     method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
     method @Deprecated public Object? getLastCustomNonConfigurationInstance();
-    method public androidx.lifecycle.Lifecycle getLifecycle();
     method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
     method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index f087fd3..2a6b68b 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -6,7 +6,6 @@
     ctor @ContentView public ComponentActivity(@LayoutRes int);
     method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
     method @Deprecated public Object? getLastCustomNonConfigurationInstance();
-    method public androidx.lifecycle.Lifecycle getLifecycle();
     method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
     method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
     method public androidx.lifecycle.ViewModelStore getViewModelStore();
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index b6edf7e..36959fc 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -18,7 +18,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     api(project(":lifecycle:lifecycle-runtime"))
     api(project(":lifecycle:lifecycle-viewmodel"))
     api("androidx.savedstate:savedstate:1.0.0-rc01")
diff --git a/ads/ads-identifier-provider/build.gradle b/ads/ads-identifier-provider/build.gradle
index 78b4ade..535bbde 100644
--- a/ads/ads-identifier-provider/build.gradle
+++ b/ads/ads-identifier-provider/build.gradle
@@ -27,7 +27,7 @@
 
 dependencies {
     implementation("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation(AUTO_VALUE_ANNOTATIONS)
     annotationProcessor(AUTO_VALUE)
 
diff --git a/ads/ads-identifier/build.gradle b/ads/ads-identifier/build.gradle
index 3eca9f2..3ab81a6 100644
--- a/ads/ads-identifier/build.gradle
+++ b/ads/ads-identifier/build.gradle
@@ -27,7 +27,7 @@
 
 dependencies {
     implementation("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation(AUTO_VALUE_ANNOTATIONS)
     annotationProcessor(AUTO_VALUE)
     api(GUAVA_LISTENABLE_FUTURE)
diff --git a/animation/build.gradle b/animation/build.gradle
index 65781d0..1d1800e 100644
--- a/animation/build.gradle
+++ b/animation/build.gradle
@@ -26,7 +26,7 @@
 
 dependencies {
     implementation("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT, libs.exclude_for_espresso)
diff --git a/animation/integration-tests/testapp/build.gradle b/animation/integration-tests/testapp/build.gradle
index 82a6fe05..a9992a4 100644
--- a/animation/integration-tests/testapp/build.gradle
+++ b/animation/integration-tests/testapp/build.gradle
@@ -23,7 +23,7 @@
 
 dependencies {
     implementation("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation(project(":animation"))
     implementation(project(":animation:testing"))
 
diff --git a/animation/testing/build.gradle b/animation/testing/build.gradle
index f33191e..ad98a4c 100644
--- a/animation/testing/build.gradle
+++ b/animation/testing/build.gradle
@@ -26,7 +26,7 @@
 
 dependencies {
     implementation("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation(project(":animation"))
     implementation(ANDROIDX_TEST_EXT_JUNIT)
     implementation(ANDROIDX_TEST_CORE)
diff --git a/appcompat/build.gradle b/appcompat/build.gradle
index 0f1a603..f9f3a5c 100644
--- a/appcompat/build.gradle
+++ b/appcompat/build.gradle
@@ -12,7 +12,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
 
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.cursoradapter:cursoradapter:1.0.0")
     api("androidx.fragment:fragment:1.1.0-rc01")
diff --git a/appcompat/res/values-v23/styles_base.xml b/appcompat/res/values-v23/styles_base.xml
index f202cb8..d0ffcc3 100644
--- a/appcompat/res/values-v23/styles_base.xml
+++ b/appcompat/res/values-v23/styles_base.xml
@@ -19,7 +19,9 @@
 
     <style name="Base.Widget.AppCompat.Button.Borderless.Colored" parent="android:Widget.Material.Button.Borderless.Colored" />
 
-    <style name="Base.Widget.AppCompat.Button.Colored" parent="android:Widget.Material.Button.Colored" />
+    <style name="Base.Widget.AppCompat.Button.Colored" parent="android:Widget.Material.Button.Colored" >
+        <item name="android:textAppearance">@style/TextAppearance.AppCompat.Widget.Button.Colored</item>
+    </style>
 
     <style name="Base.Widget.AppCompat.RatingBar.Indicator" parent="android:Widget.Material.RatingBar.Indicator" />
 
diff --git a/asynclayoutinflater/build.gradle b/asynclayoutinflater/build.gradle
index 2c12378..3dcd2f0 100644
--- a/asynclayoutinflater/build.gradle
+++ b/asynclayoutinflater/build.gradle
@@ -9,7 +9,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
 }
 
 androidx {
diff --git a/biometric/api/1.0.0-beta01.txt b/biometric/api/1.0.0-alpha06.txt
similarity index 96%
rename from biometric/api/1.0.0-beta01.txt
rename to biometric/api/1.0.0-alpha06.txt
index 63a2dfc..b17b443 100644
--- a/biometric/api/1.0.0-beta01.txt
+++ b/biometric/api/1.0.0-alpha06.txt
@@ -65,7 +65,7 @@
     method public androidx.biometric.BiometricPrompt.PromptInfo build();
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
-    method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
diff --git a/biometric/api/current.txt b/biometric/api/current.txt
index 63a2dfc..b17b443 100644
--- a/biometric/api/current.txt
+++ b/biometric/api/current.txt
@@ -65,7 +65,7 @@
     method public androidx.biometric.BiometricPrompt.PromptInfo build();
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
-    method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
diff --git a/biometric/api/res-1.0.0-beta01.txt b/biometric/api/res-1.0.0-alpha06.txt
similarity index 100%
rename from biometric/api/res-1.0.0-beta01.txt
rename to biometric/api/res-1.0.0-alpha06.txt
diff --git a/biometric/api/restricted_1.0.0-beta01.txt b/biometric/api/restricted_1.0.0-alpha06.txt
similarity index 95%
rename from biometric/api/restricted_1.0.0-beta01.txt
rename to biometric/api/restricted_1.0.0-alpha06.txt
index 6e7da51..cf9f995 100644
--- a/biometric/api/restricted_1.0.0-beta01.txt
+++ b/biometric/api/restricted_1.0.0-alpha06.txt
@@ -54,7 +54,7 @@
     method public androidx.biometric.BiometricPrompt.PromptInfo build();
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
-    method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
@@ -63,5 +63,6 @@
 
 
 
+
 }
 
diff --git a/biometric/api/restricted_current.txt b/biometric/api/restricted_current.txt
index 6e7da51..cf9f995 100644
--- a/biometric/api/restricted_current.txt
+++ b/biometric/api/restricted_current.txt
@@ -54,7 +54,7 @@
     method public androidx.biometric.BiometricPrompt.PromptInfo build();
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setConfirmationRequired(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDescription(CharSequence?);
-    method @RequiresApi(29) public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
+    method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setDeviceCredentialAllowed(boolean);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setNegativeButtonText(CharSequence);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setSubtitle(CharSequence?);
     method public androidx.biometric.BiometricPrompt.PromptInfo.Builder setTitle(CharSequence);
@@ -63,5 +63,6 @@
 
 
 
+
 }
 
diff --git a/biometric/build.gradle b/biometric/build.gradle
index e423137..e1dbcfe 100644
--- a/biometric/build.gradle
+++ b/biometric/build.gradle
@@ -10,7 +10,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.appcompat:appcompat:1.1.0-rc01")
-    api("androidx.core:core:1.1.0-rc02")
+    api("androidx.core:core:1.1.0")
     api("androidx.fragment:fragment:1.1.0-rc01")
 }
 
diff --git a/biometric/res/layout/device_credential_handler_activity.xml b/biometric/res/layout/device_credential_handler_activity.xml
new file mode 100644
index 0000000..5708761
--- /dev/null
+++ b/biometric/res/layout/device_credential_handler_activity.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent" android:layout_height="match_parent">
+
+</FrameLayout>
\ No newline at end of file
diff --git a/biometric/res/values/strings.xml b/biometric/res/values/strings.xml
index 1ee1534..04516c6 100644
--- a/biometric/res/values/strings.xml
+++ b/biometric/res/values/strings.xml
@@ -36,4 +36,10 @@
     <string name="fingerprint_error_lockout">Too many attempts. Please try again later.</string>
     <!-- Generic error message shown when an unknown error has occurred. [CHAR LIMIT=NONE] -->
     <string name="default_error_msg">Unknown error</string>
+    <!-- Generic error message shown when the authentication operation is canceled due to user
+    input. Generally not shown to the user. [CHAR LIMIT=NONE] -->
+    <string name="generic_error_user_canceled">Authentication canceled by user.</string>
+    <!-- Button label shown on a biometric authentication system dialog that lets the user
+    authenticate using their lock screen credential (such as PIN or password). [CHAR LIMIT=30] -->
+    <string name="confirm_device_credential_password">Use password</string>
 </resources>
diff --git a/biometric/res/values/styles.xml b/biometric/res/values/styles.xml
new file mode 100644
index 0000000..fce6eb0
--- /dev/null
+++ b/biometric/res/values/styles.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<resources>
+    <style name="DeviceCredentialHandlerTheme" parent="Theme.AppCompat">
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:backgroundDimEnabled">false</item>
+    </style>
+
+    <style name="TransparentStyle">
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:backgroundDimEnabled">false</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/biometric/src/main/AndroidManifest.xml b/biometric/src/main/AndroidManifest.xml
index af0a0328..8ff1f77 100644
--- a/biometric/src/main/AndroidManifest.xml
+++ b/biometric/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!-- Copyright (C) 2018 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -13,8 +13,17 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<manifest package="androidx.biometric"
-    xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="androidx.biometric">
+
     <uses-permission android:name="android.permission.USE_BIOMETRIC" />
+
     <uses-permission android:name="android.permission.USE_FINGERPRINT" />
-</manifest>
+
+    <application>
+        <activity
+            android:name=".DeviceCredentialHandlerActivity"
+            android:theme="@style/DeviceCredentialHandlerTheme" />
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/biometric/src/main/java/androidx/biometric/BiometricFragment.java b/biometric/src/main/java/androidx/biometric/BiometricFragment.java
index 941161b..26a95601 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricFragment.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricFragment.java
@@ -17,8 +17,10 @@
 package androidx.biometric;
 
 import android.annotation.SuppressLint;
+import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.CancellationSignal;
@@ -35,6 +37,7 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
 
 import java.util.concurrent.Executor;
 
@@ -43,10 +46,11 @@
  * device configuration changes. This class is not meant to be preserved after process death; for
  * security reasons, the BiometricPromptCompat will automatically stop authentication when the
  * activity is no longer in the foreground.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
-@RequiresApi(28)
+@RequiresApi(Build.VERSION_CODES.P)
 @SuppressLint("SyntheticAccessor")
 public class BiometricFragment extends Fragment {
 
@@ -75,12 +79,7 @@
 
     // Do not rely on the application's executor when calling into the framework's code.
     private final Handler mHandler = new Handler(Looper.getMainLooper());
-    private final Executor mExecutor = new Executor() {
-        @Override
-        public void execute(Runnable runnable) {
-            mHandler.post(runnable);
-        }
-    };
+    private final Executor mExecutor = mHandler::post;
 
     // Also created once and retained.
     private final android.hardware.biometrics.BiometricPrompt.AuthenticationCallback
@@ -89,18 +88,15 @@
                 @Override
                 public void onAuthenticationError(final int errorCode,
                         final CharSequence errString) {
-                    mClientExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            CharSequence error = errString;
-                            if (error == null) {
-                                error = mContext.getString(R.string.default_error_msg) + " "
-                                        + errorCode;
-                            }
-                            mClientAuthenticationCallback
-                                    .onAuthenticationError(Utils.isUnknownError(errorCode)
-                                            ? BiometricPrompt.ERROR_VENDOR : errorCode, error);
+                    mClientExecutor.execute(() -> {
+                        CharSequence error = errString;
+                        if (error == null) {
+                            error = mContext.getString(R.string.default_error_msg) + " "
+                                    + errorCode;
                         }
+                        mClientAuthenticationCallback
+                                .onAuthenticationError(Utils.isUnknownError(errorCode)
+                                        ? BiometricPrompt.ERROR_VENDOR : errorCode, error);
                     });
                     cleanup();
                 }
@@ -115,30 +111,21 @@
                 public void onAuthenticationSucceeded(
                         final android.hardware.biometrics.BiometricPrompt.AuthenticationResult
                                 result) {
-                    mClientExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            mClientAuthenticationCallback.onAuthenticationSucceeded(
+                    mClientExecutor.execute(
+                            () -> mClientAuthenticationCallback.onAuthenticationSucceeded(
                                     new BiometricPrompt.AuthenticationResult(
-                                            unwrapCryptoObject(result.getCryptoObject())));
-                        }
-                    });
+                                            unwrapCryptoObject(result.getCryptoObject()))));
                     cleanup();
                 }
 
                 @Override
                 public void onAuthenticationFailed() {
-                    mClientExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            mClientAuthenticationCallback.onAuthenticationFailed();
-                        }
-                    });
+                    mClientExecutor.execute(mClientAuthenticationCallback::onAuthenticationFailed);
                 }
             };
 
     // Also created once and retained.
-    private DialogInterface.OnClickListener mNegativeButtonListener =
+    private final DialogInterface.OnClickListener mNegativeButtonListener =
             new DialogInterface.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int which) {
@@ -146,23 +133,61 @@
                 }
             };
 
+    // Also created once and retained.
+    @SuppressWarnings("deprecation")
+    private final DialogInterface.OnClickListener mDeviceCredentialButtonListener =
+            (dialog, which) -> {
+                if (which == DialogInterface.BUTTON_NEGATIVE) {
+                    final FragmentActivity activity = getActivity();
+                    if (!(activity instanceof DeviceCredentialHandlerActivity)) {
+                        Log.e(TAG, "Failed to check device credential. Parent handler not found.");
+                        return;
+                    }
+
+                    final KeyguardManager km = activity.getSystemService(KeyguardManager.class);
+                    if (km == null) {
+                        Log.e(TAG, "Failed to check device credential. KeyguardManager was null.");
+                        return;
+                    }
+
+                    // Pass along the title and subtitle from the biometric prompt.
+                    final CharSequence title;
+                    final CharSequence subtitle;
+                    if (mBundle != null) {
+                        title = mBundle.getCharSequence(BiometricPrompt.KEY_TITLE);
+                        subtitle = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE);
+                    } else {
+                        title = null;
+                        subtitle = null;
+                    }
+
+                    // Prevent the bridge from resetting until the confirmation activity finishes.
+                    DeviceCredentialHandlerBridge bridge =
+                            DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+                    if (bridge != null) {
+                        bridge.startIgnoringReset();
+                    }
+
+                    // Launch a new instance of the confirm device credential Settings activity.
+                    final Intent intent = km.createConfirmDeviceCredentialIntent(title, subtitle);
+                    intent.setFlags(
+                            Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+                    activity.startActivityForResult(intent, 0 /* requestCode */);
+                }
+            };
+
     /**
      * Creates a new instance of the {@link BiometricFragment}.
-     * @return
      */
-    public static BiometricFragment newInstance() {
-        BiometricFragment biometricFragment = new BiometricFragment();
-        return biometricFragment;
+    static BiometricFragment newInstance() {
+        return new BiometricFragment();
     }
 
     /**
      * Sets the client's callback. This should be done whenever the lifecycle changes (orientation
      * changes).
-     * @param executor
-     * @param onClickListener
-     * @param authenticationCallback
      */
-    protected void setCallbacks(Executor executor, DialogInterface.OnClickListener onClickListener,
+    void setCallbacks(Executor executor, DialogInterface.OnClickListener onClickListener,
             BiometricPrompt.AuthenticationCallback authenticationCallback) {
         mClientExecutor = executor;
         mClientNegativeButtonListener = onClickListener;
@@ -172,16 +197,15 @@
     /**
      * Sets the crypto object to be associated with the authentication. Should be called before
      * adding the fragment to guarantee that it's ready in onCreate().
-     * @param crypto
      */
-    protected void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
+    void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
         mCryptoObject = crypto;
     }
 
     /**
      * Cancel the authentication.
      */
-    protected void cancel() {
+    void cancel() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && isDeviceCredentialAllowed()) {
             if (!mStartRespectingCancel) {
                 Log.w(TAG, "Ignoring fast cancel signal");
@@ -199,11 +223,14 @@
      */
     void cleanup() {
         mShowing = false;
+        FragmentActivity activity = getActivity();
         if (getFragmentManager() != null) {
             getFragmentManager().beginTransaction().detach(this).commitAllowingStateLoss();
         }
+        Utils.maybeFinishHandler(activity);
     }
 
+    @Nullable
     protected CharSequence getNegativeButtonText() {
         return mNegativeButtonText;
     }
@@ -218,12 +245,12 @@
         mBundle = bundle;
     }
 
-    public boolean isDeviceCredentialAllowed() {
+    boolean isDeviceCredentialAllowed() {
         return mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL, false);
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         super.onAttach(context);
         mContext = context;
     }
@@ -234,37 +261,40 @@
         // Start the actual authentication when the fragment is attached.
         if (!mShowing) {
             mNegativeButtonText = mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
+
             final android.hardware.biometrics.BiometricPrompt.Builder builder =
                     new android.hardware.biometrics.BiometricPrompt.Builder(getContext());
             builder.setTitle(mBundle.getCharSequence(BiometricPrompt.KEY_TITLE))
                     .setSubtitle(mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE))
                     .setDescription(mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION));
-            // The negative text could be empty if setDeviceCredentialAllowed is true.
-            if (!TextUtils.isEmpty(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT))) {
+
+            final boolean allowDeviceCredential =
+                    mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL);
+
+            // Provide our own negative button text if allowing device credential on <= P.
+            if (allowDeviceCredential && Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
+                mNegativeButtonText = getString(R.string.confirm_device_credential_password);
                 builder.setNegativeButton(
-                        mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT),
-                        mClientExecutor, mNegativeButtonListener);
+                        mNegativeButtonText, mClientExecutor, mDeviceCredentialButtonListener);
+            } else if (!TextUtils.isEmpty(mNegativeButtonText)) {
+                builder.setNegativeButton(
+                        mNegativeButtonText, mClientExecutor, mNegativeButtonListener);
             }
 
+            // Set builder flags introduced in Q.
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                 builder.setConfirmationRequired(
                         mBundle.getBoolean((BiometricPrompt.KEY_REQUIRE_CONFIRMATION), true));
-                builder.setDeviceCredentialAllowed(
-                        mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL));
+                builder.setDeviceCredentialAllowed(allowDeviceCredential);
             }
 
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-                if (mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL, false)) {
-                    mStartRespectingCancel = false;
-                    mHandler.postDelayed(new Runnable() {
-                        @Override
-                        public void run() {
-                            // Hack almost over 9000, ignore cancel signal in Q if it's within the
-                            // first quarter second.
-                            mStartRespectingCancel = true;
-                        }
-                    }, 250 /* ms */);
-                }
+            if (allowDeviceCredential) {
+                mStartRespectingCancel = false;
+                mHandler.postDelayed(() -> {
+                    // Hack almost over 9000, ignore cancel signal if it's within the first quarter
+                    // second.
+                    mStartRespectingCancel = true;
+                }, 250 /* ms */);
             }
 
             mBiometricPrompt = builder.build();
@@ -281,7 +311,7 @@
         return super.onCreateView(inflater, container, savedInstanceState);
     }
 
-    static BiometricPrompt.CryptoObject unwrapCryptoObject(
+    private static BiometricPrompt.CryptoObject unwrapCryptoObject(
             android.hardware.biometrics.BiometricPrompt.CryptoObject cryptoObject) {
         if (cryptoObject == null) {
             return null;
@@ -296,7 +326,7 @@
         }
     }
 
-    static android.hardware.biometrics.BiometricPrompt.CryptoObject wrapCryptoObject(
+    private static android.hardware.biometrics.BiometricPrompt.CryptoObject wrapCryptoObject(
             BiometricPrompt.CryptoObject cryptoObject) {
         if (cryptoObject == null) {
             return null;
diff --git a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
index cd000b0..eb98834 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
@@ -20,6 +20,8 @@
 
 import android.annotation.SuppressLint;
 import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
@@ -29,7 +31,7 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
+import androidx.annotation.RestrictTo;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
@@ -81,6 +83,7 @@
     static final String KEY_NEGATIVE_TEXT = "negative_text";
     static final String KEY_REQUIRE_CONFIRMATION = "require_confirmation";
     static final String KEY_ALLOW_DEVICE_CREDENTIAL = "allow_device_credential";
+    static final String KEY_HANDLING_DEVICE_CREDENTIAL_RESULT = "handling_device_credential_result";
 
     @Retention(SOURCE)
     @IntDef({ERROR_HW_UNAVAILABLE,
@@ -96,7 +99,8 @@
             ERROR_HW_NOT_PRESENT,
             ERROR_NEGATIVE_BUTTON,
             ERROR_NO_DEVICE_CREDENTIAL})
-    private @interface BiometricError {}
+    private @interface BiometricError {
+    }
 
     /**
      * A wrapper class for the crypto objects supported by BiometricPrompt. Currently the
@@ -127,6 +131,7 @@
 
         /**
          * Get {@link Signature} object.
+         *
          * @return {@link Signature} object or null if this doesn't contain one.
          */
         @Nullable
@@ -136,6 +141,7 @@
 
         /**
          * Get {@link Cipher} object.
+         *
          * @return {@link Cipher} object or null if this doesn't contain one.
          */
         @Nullable
@@ -145,6 +151,7 @@
 
         /**
          * Get {@link Mac} object.
+         *
          * @return {@link Mac} object or null if this doesn't contain one.
          */
         @Nullable
@@ -161,7 +168,7 @@
         private final CryptoObject mCryptoObject;
 
         /**
-         * @param crypto
+         *
          */
         AuthenticationResult(CryptoObject crypto) {
             mCryptoObject = crypto;
@@ -169,6 +176,7 @@
 
         /**
          * Obtain the crypto object associated with this transaction
+         *
          * @return crypto object provided to {@link #authenticate(PromptInfo, CryptoObject)}.
          */
         @Nullable
@@ -186,24 +194,29 @@
         /**
          * Called when an unrecoverable error has been encountered and the operation is complete.
          * No further actions will be made on this object.
+         *
          * @param errorCode An integer identifying the error message. The error message will usually
          *                  be one of the BIOMETRIC_ERROR constants.
          * @param errString A human-readable error string that can be shown on an UI
          */
         public void onAuthenticationError(@BiometricError int errorCode,
-                @NonNull CharSequence errString) {}
+                @NonNull CharSequence errString) {
+        }
 
         /**
          * Called when a biometric is recognized.
+         *
          * @param result An object containing authentication-related data
          */
-        public void onAuthenticationSucceeded(@NonNull AuthenticationResult result) {}
+        public void onAuthenticationSucceeded(@NonNull AuthenticationResult result) {
+        }
 
         /**
          * Called when a biometric is valid but not recognized.
          */
 
-        public void onAuthenticationFailed() {}
+        public void onAuthenticationFailed() {
+        }
     }
 
     /**
@@ -249,8 +262,6 @@
              * Required: Set the text for the negative button. This would typically be used as a
              * "Cancel" button, but may be also used to show an alternative method for
              * authentication, such as screen that asks for a backup password.
-             * @param text
-             * @return
              */
             @NonNull
             public Builder setNegativeButtonText(@NonNull CharSequence text) {
@@ -288,16 +299,19 @@
              * first check {@link android.app.KeyguardManager#isDeviceSecure()} before enabling
              * this. If the device is not secure, {@link BiometricPrompt#ERROR_NO_DEVICE_CREDENTIAL}
              * will be returned in
-             * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}}
+             * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}.
              *
              * Note that {@link Builder#setNegativeButtonText(CharSequence)} should not be set
              * if this is set to true.
              *
+             * On versions P and below, once the device credential prompt is shown,
+             * {@link #cancelAuthentication()} will not work, since the library internally launches
+             * {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence,
+             * CharSequence)}, which does not have a public API for cancellation.
+             *
              * @param enable When true, the prompt will fall back to ask for the user's device
              *               credentials (PIN, pattern, or password).
-             * @return
              */
-            @RequiresApi(29)
             @NonNull
             public Builder setDeviceCredentialAllowed(boolean enable) {
                 mBundle.putBoolean(KEY_ALLOW_DEVICE_CREDENTIAL, enable);
@@ -305,7 +319,23 @@
             }
 
             /**
+             * A flag that is set to true when launching the prompt within the transparent
+             * {@link DeviceCredentialHandlerActivity}. This lets us handle the result of {@link
+             * android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence,
+             * CharSequence)} in order to allow device credentials for <= P.
+             *
+             * @hide
+             */
+            @RestrictTo(RestrictTo.Scope.LIBRARY)
+            @NonNull
+            Builder setHandlingDeviceCredentialResult(boolean isHandling) {
+                mBundle.putBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT, isHandling);
+                return this;
+            }
+
+            /**
              * Creates a {@link BiometricPrompt}.
+             *
              * @return a {@link BiometricPrompt}
              * @throws IllegalArgumentException if any of the required fields are not set.
              */
@@ -314,6 +344,8 @@
                 final CharSequence title = mBundle.getCharSequence(KEY_TITLE);
                 final CharSequence negative = mBundle.getCharSequence(KEY_NEGATIVE_TEXT);
                 boolean allowDeviceCredential = mBundle.getBoolean(KEY_ALLOW_DEVICE_CREDENTIAL);
+                boolean handlingDeviceCredentialResult =
+                        mBundle.getBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT);
 
                 if (TextUtils.isEmpty(title)) {
                     throw new IllegalArgumentException("Title must be set and non-empty");
@@ -325,6 +357,10 @@
                     throw new IllegalArgumentException("Can't have both negative button behavior"
                             + " and device credential enabled");
                 }
+                if (handlingDeviceCredentialResult && !allowDeviceCredential) {
+                    throw new IllegalArgumentException("Can't be handling device credential result"
+                            + " without device credential enabled");
+                }
                 return new PromptInfo(mBundle);
             }
         }
@@ -384,57 +420,63 @@
         public boolean isDeviceCredentialAllowed() {
             return mBundle.getBoolean(KEY_ALLOW_DEVICE_CREDENTIAL);
         }
+
+        /**
+         * @return See {@link Builder#setHandlingDeviceCredentialResult(boolean)}.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        boolean isHandlingDeviceCredentialResult() {
+            return mBundle.getBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT);
+        }
     }
 
     // Passed in from the client.
-    FragmentActivity mFragmentActivity;
-    Fragment mFragment;
-    final Executor mExecutor;
-    final AuthenticationCallback mAuthenticationCallback;
+    private FragmentActivity mFragmentActivity;
+    private Fragment mFragment;
+    private final Executor mExecutor;
+    private final AuthenticationCallback mAuthenticationCallback;
 
     // Created internally for devices before P.
-    FingerprintDialogFragment mFingerprintDialogFragment;
-    FingerprintHelperFragment mFingerprintHelperFragment;
+    private FingerprintDialogFragment mFingerprintDialogFragment;
+    private FingerprintHelperFragment mFingerprintHelperFragment;
 
     // Created internally for devices P and above.
-    BiometricFragment mBiometricFragment;
+    private BiometricFragment mBiometricFragment;
 
     // In Q, we must ignore the first onPause if setDeviceCredentialAllowed is true, since
     // the Q implementation launches ConfirmDeviceCredentialActivity which is an activity and
     // puts the client app onPause.
-    boolean mPausedOnce;
+    private boolean mPausedOnce;
+
+    // Whether this prompt is being hosted in DeviceCredentialHandlerActivity.
+    private boolean mIsHandlingDeviceCredential;
 
     /**
-     *  A shim to interface with the framework API and simplify the support library's API.
-     *  The support library sends onAuthenticationError when the negative button is pressed.
-     *  Conveniently, the {@link FingerprintDialogFragment} also uses the
-     *  {@DialogInterface.OnClickListener} for its buttons ;)
+     * A shim to interface with the framework API and simplify the support library's API.
+     * The support library sends onAuthenticationError when the negative button is pressed.
+     * Conveniently, the {@link FingerprintDialogFragment} also uses the
+     * {@link DialogInterface.OnClickListener} for its buttons ;)
      */
-    final DialogInterface.OnClickListener mNegativeButtonListener =
+    private final DialogInterface.OnClickListener mNegativeButtonListener =
             new DialogInterface.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int which) {
-                    mExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
-                                    && !DEBUG_FORCE_FINGERPRINT) {
-                                CharSequence errorText =
-                                        mBiometricFragment.getNegativeButtonText();
-                                mAuthenticationCallback.onAuthenticationError(
-                                        ERROR_NEGATIVE_BUTTON,
-                                        errorText);
-                                mBiometricFragment.cleanup();
-                            } else {
-                                CharSequence errorText =
-                                        mFingerprintDialogFragment.getNegativeButtonText();
-                                mAuthenticationCallback.onAuthenticationError(
-                                        ERROR_NEGATIVE_BUTTON,
-                                        errorText);
-                                mFingerprintHelperFragment.cancel(
-                                        FingerprintHelperFragment
-                                                .USER_CANCELED_FROM_NEGATIVE_BUTTON);
-                            }
+                    mExecutor.execute(() -> {
+                        if (usingBiometricFragment()) {
+                            final CharSequence errorText =
+                                    mBiometricFragment.getNegativeButtonText();
+                            mAuthenticationCallback.onAuthenticationError(
+                                    ERROR_NEGATIVE_BUTTON, errorText != null ? errorText : "");
+                            mBiometricFragment.cleanup();
+                        } else {
+                            final CharSequence errorText =
+                                    mFingerprintDialogFragment.getNegativeButtonText();
+                            mAuthenticationCallback.onAuthenticationError(
+                                    ERROR_NEGATIVE_BUTTON, errorText != null ? errorText : "");
+                            mFingerprintHelperFragment.cancel(
+                                    FingerprintHelperFragment.USER_CANCELED_FROM_NEGATIVE_BUTTON);
                         }
                     });
                 }
@@ -448,21 +490,14 @@
         @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
         void onPause() {
             if (!isChangingConfigurations()) {
-                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
+                if (usingBiometricFragment()) {
                     // May be null if no authentication is occurring.
-                    if (mFingerprintDialogFragment != null) {
-                        mFingerprintDialogFragment.dismiss();
-                    }
-                    if (mFingerprintHelperFragment != null) {
-                        mFingerprintHelperFragment.cancel(
-                                FingerprintHelperFragment.USER_CANCELED_FROM_NONE);
-                    }
-                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
-                    // TODO(b/123378871): Change == to >= if this bug is not resolved in R.
-                    // Ignore the first onPause if setDeviceCredentialAllowed is true, since
-                    // the Q implementation launches ConfirmDeviceCredentialActivity which is an
-                    // activity and puts the client app onPause.
                     if (mBiometricFragment != null) {
+                        // TODO(b/123378871): Fix behavior in R and remove this workaround.
+                        // Ignore the first onPause if isDeviceCredentialAllowed is true, since
+                        // the Q implementation launches ConfirmDeviceCredentialActivity, which puts
+                        // the client app onPause. Implementations prior to Q instead launch
+                        // DeviceCredentialHandlerActivity, resulting in the same problem.
                         if (mBiometricFragment.isDeviceCredentialAllowed()) {
                             if (!mPausedOnce) {
                                 mPausedOnce = true;
@@ -473,17 +508,20 @@
                             mBiometricFragment.cancel();
                         }
                     }
-                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-                    if (mBiometricFragment != null) {
-                        mBiometricFragment.cancel();
+                } else {
+                    // May be null if no authentication is occurring.
+                    if (mFingerprintDialogFragment != null && mFingerprintHelperFragment != null) {
+                        dismissFingerprintFragments(mFingerprintDialogFragment,
+                                    mFingerprintHelperFragment);
                     }
                 }
+                maybeResetHandlerBridge();
             }
         }
 
         @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
         void onResume() {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
+            if (usingBiometricFragment()) {
                 mBiometricFragment =
                         (BiometricFragment) getFragmentManager().findFragmentByTag(
                                 BIOMETRIC_FRAGMENT_TAG);
@@ -508,12 +546,15 @@
                     mFingerprintHelperFragment.setHandler(mFingerprintDialogFragment.getHandler());
                 }
             }
+
+            maybeHandleDeviceCredentialResult();
+            maybeInitHandlerBridge(false /* ignoreNextReset */);
         }
     };
 
     /**
      * Constructs a {@link BiometricPrompt} which can be used to prompt the user for
-     * authentication. The authenticaton prompt created by
+     * authentication. The authentication prompt created by
      * {@link BiometricPrompt#authenticate(PromptInfo, CryptoObject)} and
      * {@link BiometricPrompt#authenticate(PromptInfo)} will persist across device
      * configuration changes by default. If authentication is in progress, re-creating
@@ -523,8 +564,8 @@
      * such as {@link FragmentActivity#onCreate(Bundle)}.
      *
      * @param fragmentActivity A reference to the client's activity.
-     * @param executor An executor to handle callback events.
-     * @param callback An object to receive authentication events.
+     * @param executor         An executor to handle callback events.
+     * @param callback         An object to receive authentication events.
      */
     @SuppressLint("LambdaLast")
     public BiometricPrompt(@NonNull FragmentActivity fragmentActivity,
@@ -582,8 +623,9 @@
     /**
      * Shows the biometric prompt. The prompt survives lifecycle changes by default. To cancel the
      * authentication, use {@link #cancelAuthentication()}.
-     * @param info The information that will be displayed on the prompt. Create this object using
-     *             {@link BiometricPrompt.PromptInfo.Builder}.
+     *
+     * @param info   The information that will be displayed on the prompt. Create this object using
+     *               {@link BiometricPrompt.PromptInfo.Builder}.
      * @param crypto The crypto object associated with the authentication.
      */
     public void authenticate(@NonNull PromptInfo info, @NonNull CryptoObject crypto) {
@@ -600,6 +642,7 @@
     /**
      * Shows the biometric prompt. The prompt survives lifecycle changes by default. To cancel the
      * authentication, use {@link #cancelAuthentication()}.
+     *
      * @param info The information that will be displayed on the prompt. Create this object using
      *             {@link BiometricPrompt.PromptInfo.Builder}.
      */
@@ -611,12 +654,19 @@
     }
 
     private void authenticateInternal(@NonNull PromptInfo info, @Nullable CryptoObject crypto) {
+        mIsHandlingDeviceCredential = info.isHandlingDeviceCredentialResult();
+        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P && info.isDeviceCredentialAllowed()
+                && !mIsHandlingDeviceCredential) {
+            launchDeviceCredentialHandler(info);
+            return;
+        }
+
         final Bundle bundle = info.getBundle();
         final FragmentManager fragmentManager = getFragmentManager();
 
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
-            mPausedOnce = false;
+        mPausedOnce = false;
 
+        if (usingBiometricFragment()) {
             BiometricFragment biometricFragment =
                     (BiometricFragment) fragmentManager.findFragmentByTag(
                             BIOMETRIC_FRAGMENT_TAG);
@@ -627,6 +677,7 @@
             }
             mBiometricFragment.setCallbacks(mExecutor, mNegativeButtonListener,
                     mAuthenticationCallback);
+
             // Set the crypto object.
             mBiometricFragment.setCryptoObject(crypto);
             mBiometricFragment.setBundle(bundle);
@@ -687,6 +738,7 @@
                 fragmentManager.beginTransaction().attach(mFingerprintHelperFragment).commit();
             }
         }
+
         // For the case when onResume() is being called right after authenticate,
         // we need to make sure that all fragment transactions have been committed.
         fragmentManager.executePendingTransactions();
@@ -695,26 +747,162 @@
     /**
      * Cancels the biometric authentication, and dismisses the dialog upon confirmation from the
      * biometric service.
+     *
+     * On P or below, calling this method when the device credential prompt is shown will NOT work
+     * as expected. See {@link PromptInfo.Builder#setDeviceCredentialAllowed(boolean)} for more
+     * details.
      */
     public void cancelAuthentication() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT) {
+        if (usingBiometricFragment()) {
             if (mBiometricFragment != null) {
                 mBiometricFragment.cancel();
             }
+
+            // If we launched a device credential handler activity, also clean up its fragment.
+            if (!mIsHandlingDeviceCredential) {
+                final DeviceCredentialHandlerBridge bridge =
+                        DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+                if (bridge != null && bridge.getBiometricFragment() != null) {
+                    bridge.getBiometricFragment().cancel();
+                }
+            }
         } else {
             if (mFingerprintHelperFragment != null && mFingerprintDialogFragment != null) {
-                mFingerprintHelperFragment.cancel(
-                        FingerprintHelperFragment.USER_CANCELED_FROM_NONE);
-                mFingerprintDialogFragment.dismiss();
+                dismissFingerprintFragments(mFingerprintDialogFragment, mFingerprintHelperFragment);
             }
+
+            // If we launched a device credential handler activity, also clean up its fragment.
+            if (!mIsHandlingDeviceCredential) {
+                final DeviceCredentialHandlerBridge bridge =
+                        DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+                if (bridge != null && bridge.getFingerprintDialogFragment() != null
+                        && bridge.getFingerprintHelperFragment() != null) {
+                    dismissFingerprintFragments(bridge.getFingerprintDialogFragment(),
+                            bridge.getFingerprintHelperFragment());
+                }
+            }
+        }
+    }
+
+    /**
+     * Launches a copy of this prompt in a transparent {@link DeviceCredentialHandlerActivity}.
+     * This allows that activity to intercept and handle activity results from {@link
+     * android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence)}.
+     */
+    private void launchDeviceCredentialHandler(PromptInfo info) {
+        final FragmentActivity activity = getActivity();
+        if (activity == null || activity.isFinishing()) {
+            Log.w(TAG, "Failed to start handler activity. Parent activity was null or finishing.");
+            return;
+        }
+
+        maybeInitHandlerBridge(true /* ignoreNextReset */);
+
+        // Set the handling device credential flag so the new prompt knows not to launch another
+        // instance of the handler activity.
+        final Bundle infoBundle = info.getBundle();
+        infoBundle.putBoolean(KEY_HANDLING_DEVICE_CREDENTIAL_RESULT, true);
+
+        final Intent intent = new Intent(activity, DeviceCredentialHandlerActivity.class);
+        intent.putExtra(DeviceCredentialHandlerActivity.EXTRA_PROMPT_INFO_BUNDLE, infoBundle);
+        activity.startActivity(intent);
+    }
+
+    /**
+     * Creates (if necessary) the singleton bridge used for communication between the client-hosted
+     * prompt and one hosted by {@link DeviceCredentialHandlerActivity}, and initializes all of the
+     * relevant data for the bridge.
+     *
+     * @param ignoreNextReset Whether the bridge should ignore the next call to
+     * {@link DeviceCredentialHandlerBridge#reset()} once initialized.
+     */
+    private void maybeInitHandlerBridge(boolean ignoreNextReset) {
+        // Don't create bridge if DeviceCredentialHandlerActivity isn't needed.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+            return;
+        }
+
+        final DeviceCredentialHandlerBridge bridge = DeviceCredentialHandlerBridge.getInstance();
+        if (mIsHandlingDeviceCredential) {
+            if (usingBiometricFragment() && mBiometricFragment != null) {
+                bridge.setBiometricFragment(mBiometricFragment);
+            } else if (mFingerprintDialogFragment != null && mFingerprintHelperFragment != null) {
+                bridge.setFingerprintFragments(mFingerprintDialogFragment,
+                        mFingerprintHelperFragment);
+            }
+        } else {
+            // If hosted by the client, register the current activity theme to the bridge.
+            final FragmentActivity activity = getActivity();
+            if (activity != null) {
+                try {
+                    bridge.setClientThemeResId(activity.getPackageManager().getActivityInfo(
+                            activity.getComponentName(), 0).getThemeResource());
+                } catch (PackageManager.NameNotFoundException e) {
+                    Log.e(TAG, "Failed to register client theme to bridge", e);
+                }
+            }
+        }
+        bridge.setCallbacks(mExecutor, mNegativeButtonListener, mAuthenticationCallback);
+
+        if (ignoreNextReset) {
+            bridge.ignoreNextReset();
+        }
+    }
+
+    /**
+     * Checks the handler bridge to see if we've received a result from the confirm device
+     * credential Settings activity. If so, handles that result by calling the appropriate
+     * authentication callback.
+     */
+    private void maybeHandleDeviceCredentialResult() {
+        // Only handle result from the original (not handler-hosted) prompt.
+        if (mIsHandlingDeviceCredential) {
+            return;
+        }
+
+        final DeviceCredentialHandlerBridge bridge =
+                DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+        if (bridge != null) {
+            switch (bridge.getDeviceCredentialResult()) {
+                case DeviceCredentialHandlerBridge.RESULT_SUCCESS:
+                    // Device credential auth succeeded. This is incompatible with crypto.
+                    mAuthenticationCallback.onAuthenticationSucceeded(
+                            new BiometricPrompt.AuthenticationResult(null /* crypto */));
+                    bridge.stopIgnoringReset();
+                    bridge.reset();
+                    break;
+
+                case DeviceCredentialHandlerBridge.RESULT_ERROR:
+                    // Device credential auth failed. Assume this is due to the user canceling.
+                    final CharSequence errorMsg = getActivity() != null
+                            ? getActivity().getString(R.string.generic_error_user_canceled) : "";
+                    mAuthenticationCallback.onAuthenticationError(
+                            BiometricConstants.ERROR_USER_CANCELED, errorMsg);
+                    bridge.stopIgnoringReset();
+                    bridge.reset();
+                    break;
+            }
+        }
+    }
+
+    /** Cleans up the device credential handler bridge (if it exists) to avoid leaking memory. */
+    private void maybeResetHandlerBridge() {
+        final DeviceCredentialHandlerBridge bridge =
+                DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+        if (bridge != null) {
+            bridge.reset();
         }
     }
 
     /** Checks if the client is currently changing configurations (e.g., screen orientation). */
     private boolean isChangingConfigurations() {
-        return (mFragmentActivity != null && mFragmentActivity.isChangingConfigurations())
-                || (mFragment != null && mFragment.getActivity() != null
-                && mFragment.getActivity().isChangingConfigurations());
+        return getActivity() != null && getActivity().isChangingConfigurations();
+    }
+
+    /** Gets the client activity that is hosting the biometric prompt. */
+    @Nullable
+    private FragmentActivity getActivity() {
+        return mFragmentActivity != null ? mFragmentActivity : mFragment.getActivity();
     }
 
     /**
@@ -722,8 +910,26 @@
      * manager for a client activity or the child fragment manager for a client fragment.
      */
     private FragmentManager getFragmentManager() {
-        return mFragmentActivity != null
-                ? mFragmentActivity.getSupportFragmentManager()
+        return mFragmentActivity != null ? mFragmentActivity.getSupportFragmentManager()
                 : mFragment.getChildFragmentManager();
     }
+
+    /**
+     * @return True if the prompt handles authentication via {@link BiometricFragment}, or false
+     * if it does so via {@link FingerprintDialogFragment}.
+     */
+    private static boolean usingBiometricFragment() {
+        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !DEBUG_FORCE_FINGERPRINT;
+    }
+
+    /**
+     * Dismisses the given {@link FingerprintDialogFragment} and {@link FingerprintHelperFragment},
+     * both of which must be non-null.
+     */
+    private static void dismissFingerprintFragments(
+            @NonNull FingerprintDialogFragment fingerprintDialogFragment,
+            @NonNull FingerprintHelperFragment fingerprintHelperFragment) {
+        fingerprintDialogFragment.dismiss();
+        fingerprintHelperFragment.cancel(FingerprintHelperFragment.USER_CANCELED_FROM_NONE);
+    }
 }
diff --git a/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerActivity.java b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerActivity.java
new file mode 100644
index 0000000..4d8f784
--- /dev/null
+++ b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerActivity.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.biometric;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.appcompat.app.AppCompatActivity;
+
+/**
+ * Transparent activity that is responsible for re-launching the {@link BiometricPrompt} and
+ * handling results from {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(
+ * CharSequence, CharSequence)} in order to allow device credential authentication prior to Q.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+@SuppressLint("SyntheticAccessor")
+public class DeviceCredentialHandlerActivity extends AppCompatActivity {
+    private static final String TAG = "DeviceCredentialHandler";
+
+    static final String EXTRA_PROMPT_INFO_BUNDLE = "prompt_info_bundle";
+
+    @Nullable
+    private DeviceCredentialHandlerBridge mBridge;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        // Apply the client activity's theme to ensure proper dialog styling.
+        DeviceCredentialHandlerBridge bridge =
+                DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+        if (bridge != null && bridge.getClientThemeResId() != 0) {
+            setTheme(bridge.getClientThemeResId());
+            getTheme().applyStyle(R.style.TransparentStyle, true /* force */);
+        }
+
+        // Must be called after setting the theme.
+        super.onCreate(savedInstanceState);
+        setTitle(null);
+        setContentView(R.layout.device_credential_handler_activity);
+
+        mBridge = DeviceCredentialHandlerBridge.getInstance();
+        if (mBridge.getExecutor() == null || mBridge.getAuthenticationCallback() == null) {
+            Log.e(TAG, "onCreate: Executor and/or callback was null!");
+        } else {
+            // (Re)connect to and launch a biometric prompt within this activity.
+            final BiometricPrompt biometricPrompt = new BiometricPrompt(this,
+                    mBridge.getExecutor(), mBridge.getAuthenticationCallback());
+            final Bundle infoBundle = getIntent().getBundleExtra(EXTRA_PROMPT_INFO_BUNDLE);
+            final BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo(infoBundle);
+            biometricPrompt.authenticate(info);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+
+        // Prevent the client from resetting the bridge in onPause if just changing configuration.
+        if (isChangingConfigurations() && mBridge != null) {
+            mBridge.ignoreNextReset();
+        }
+    }
+
+    // Handles the result of startActivity invoked by the attached BiometricPrompt.
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        // Handle result from ConfirmDeviceCredentialActivity.
+        if (mBridge == null || mBridge.getAuthenticationCallback() == null) {
+            Log.e(TAG, "onActivityResult: Bridge or callback was null!");
+        } else if (resultCode == RESULT_OK) {
+            mBridge.setDeviceCredentialResult(DeviceCredentialHandlerBridge.RESULT_SUCCESS);
+        } else {
+            // Treat any non-OK result as a user cancellation.
+            mBridge.setDeviceCredentialResult(DeviceCredentialHandlerBridge.RESULT_ERROR);
+        }
+
+        finish();
+    }
+}
diff --git a/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerBridge.java b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerBridge.java
new file mode 100644
index 0000000..4778afc
--- /dev/null
+++ b/biometric/src/main/java/androidx/biometric/DeviceCredentialHandlerBridge.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.biometric;
+
+import android.annotation.SuppressLint;
+import android.content.DialogInterface;
+import android.os.Build;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.concurrent.Executor;
+
+/**
+ * Singleton class to facilitate communication between the {@link BiometricPrompt} for the client
+ * activity and the one attached to {@link DeviceCredentialHandlerActivity} when allowing device
+ * credential authentication prior to Q.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+class DeviceCredentialHandlerBridge {
+    @Nullable
+    private static DeviceCredentialHandlerBridge sInstance;
+
+    private int mClientThemeResId;
+
+    @Nullable
+    private BiometricFragment mBiometricFragment;
+
+    @Nullable
+    private FingerprintDialogFragment mFingerprintDialogFragment;
+
+    @Nullable
+    private FingerprintHelperFragment mFingerprintHelperFragment;
+
+    @Nullable
+    private Executor mExecutor;
+
+    @Nullable
+    private DialogInterface.OnClickListener mOnClickListener;
+
+    @Nullable
+    private BiometricPrompt.AuthenticationCallback mAuthenticationCallback;
+
+    // Possible results from launching the confirm device credential Settings activity.
+    static final int RESULT_NONE = 0;
+    static final int RESULT_SUCCESS = 1;
+    static final int RESULT_ERROR = 2;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({RESULT_NONE, RESULT_SUCCESS, RESULT_ERROR})
+    private @interface DeviceCredentialResult {}
+
+    private @DeviceCredentialResult int mDeviceCredentialResult = RESULT_NONE;
+
+    // States indicating whether and for how long to ignore calls to reset().
+    private static final int NOT_IGNORING_RESET = 0;
+    private static final int IGNORING_NEXT_RESET = 1;
+    private static final int IGNORING_RESET = 2;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({NOT_IGNORING_RESET, IGNORING_NEXT_RESET, IGNORING_RESET})
+    private @interface IgnoreResetState {}
+
+    private @IgnoreResetState int mIgnoreResetState = NOT_IGNORING_RESET;
+
+    // Private constructor to enforce singleton pattern.
+    private DeviceCredentialHandlerBridge() {
+    }
+
+    /** @return The singleton bridge, creating it if necessary. */
+    @NonNull
+    static DeviceCredentialHandlerBridge getInstance() {
+        if (sInstance == null) {
+            sInstance = new DeviceCredentialHandlerBridge();
+        }
+        return sInstance;
+    }
+
+    /** @return The singleton bridge if already created, or null otherwise. */
+    @Nullable
+    static DeviceCredentialHandlerBridge getInstanceIfNotNull() {
+        return sInstance;
+    }
+
+    /**
+     * Register the resource ID for the client activity's theme to the bridge. This will be used
+     * for styling dialogs and other views in the handler activity.
+     */
+    void setClientThemeResId(int clientThemeResId) {
+        mClientThemeResId = clientThemeResId;
+    }
+
+    /** @return See {@link #setClientThemeResId(int)}. */
+    int getClientThemeResId() {
+        return mClientThemeResId;
+    }
+
+    /**
+     * Registers a {@link BiometricFragment} to the bridge. This will automatically receive new
+     * callbacks set by {@link #setCallbacks(Executor, DialogInterface.OnClickListener,
+     * BiometricPrompt.AuthenticationCallback)}.
+     */
+    void setBiometricFragment(@Nullable BiometricFragment biometricFragment) {
+        mBiometricFragment = biometricFragment;
+    }
+
+    /** @return See {@link #setBiometricFragment(BiometricFragment)}. */
+    @Nullable
+    BiometricFragment getBiometricFragment() {
+        return mBiometricFragment;
+    }
+
+    /**
+     * Registers a {@link FingerprintDialogFragment} and {@link FingerprintHelperFragment} to the
+     * bridge. These will automatically receive new callbacks set by {@link #setCallbacks(Executor,
+     * DialogInterface.OnClickListener, BiometricPrompt.AuthenticationCallback)}.
+     */
+    void setFingerprintFragments(@Nullable FingerprintDialogFragment fingerprintDialogFragment,
+            @Nullable FingerprintHelperFragment fingerprintHelperFragment) {
+        mFingerprintDialogFragment = fingerprintDialogFragment;
+        mFingerprintHelperFragment = fingerprintHelperFragment;
+    }
+
+    /**
+     * @return The latest {@link FingerprintDialogFragment} set via
+     * {@link #setFingerprintFragments(FingerprintDialogFragment, FingerprintHelperFragment)}.
+     */
+    @Nullable
+    public FingerprintDialogFragment getFingerprintDialogFragment() {
+        return mFingerprintDialogFragment;
+    }
+
+    /**
+     * @return The latest {@link FingerprintHelperFragment} set via
+     * {@link #setFingerprintFragments(FingerprintDialogFragment, FingerprintHelperFragment)}.
+     */
+    @Nullable
+    public FingerprintHelperFragment getFingerprintHelperFragment() {
+        return mFingerprintHelperFragment;
+    }
+
+    /**
+     * Registers dialog and authentication callbacks to the bridge, along with an executor that can
+     * be used to run them.
+     *
+     * If a {@link BiometricFragment} has been registered via
+     * {@link #setBiometricFragment(BiometricFragment)}, or if a {@link FingerprintDialogFragment}
+     * and {@link FingerprintHelperFragment} have been registered via
+     * {@link #setFingerprintFragments(FingerprintDialogFragment, FingerprintHelperFragment)}, then
+     * these fragments will receive the updated executor and callbacks as well.
+     *
+     * @param executor               An executor that can be used to run callbacks.
+     * @param onClickListener        A dialog button listener for a biometric prompt.
+     * @param authenticationCallback A handler for various biometric prompt authentication events.
+     */
+    @SuppressLint("LambdaLast")
+    void setCallbacks(@NonNull Executor executor,
+            @NonNull DialogInterface.OnClickListener onClickListener,
+            @NonNull BiometricPrompt.AuthenticationCallback authenticationCallback) {
+        mExecutor = executor;
+        mOnClickListener = onClickListener;
+        mAuthenticationCallback = authenticationCallback;
+        if (mBiometricFragment != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            mBiometricFragment.setCallbacks(executor, onClickListener, authenticationCallback);
+        } else if (mFingerprintDialogFragment != null && mFingerprintHelperFragment != null) {
+            mFingerprintDialogFragment.setNegativeButtonListener(onClickListener);
+            mFingerprintHelperFragment.setCallback(executor, authenticationCallback);
+            mFingerprintHelperFragment.setHandler(mFingerprintDialogFragment.getHandler());
+        }
+    }
+
+    /**
+     * @return The latest {@link Executor} set via {@link #setCallbacks(Executor,
+     * DialogInterface.OnClickListener, BiometricPrompt.AuthenticationCallback)}.
+     */
+    @Nullable
+    Executor getExecutor() {
+        return mExecutor;
+    }
+
+    /**
+     * @return The latest {@link DialogInterface.OnClickListener} set via {@link #setCallbacks(
+     * Executor, DialogInterface.OnClickListener, BiometricPrompt.AuthenticationCallback)}.
+     */
+    @Nullable
+    DialogInterface.OnClickListener getOnClickListener() {
+        return mOnClickListener;
+    }
+
+    /**
+     * @return The latest {@link BiometricPrompt.AuthenticationCallback} set via
+     * {@link #setCallbacks(Executor, DialogInterface.OnClickListener,
+     * BiometricPrompt.AuthenticationCallback)}.
+     */
+    @Nullable
+    BiometricPrompt.AuthenticationCallback getAuthenticationCallback() {
+        return mAuthenticationCallback;
+    }
+
+    /**
+     * Stores the authentication result from launching the confirm device credential Settings
+     * activity. This is intended for the client's {@link BiometricPrompt} instance to read this
+     * result and invoke the appropriate authentication callback method.
+     */
+    void setDeviceCredentialResult(int deviceCredentialResult) {
+        mDeviceCredentialResult = deviceCredentialResult;
+    }
+
+    /** @return See {@link #setDeviceCredentialResult(int)}. */
+    int getDeviceCredentialResult() {
+        return mDeviceCredentialResult;
+    }
+
+    /**
+     * Indicates that the bridge should ignore the next call to {@link #reset}. Calling this method
+     * after {@link #startIgnoringReset()} but before {@link #stopIgnoringReset()} has no effect.
+     */
+    void ignoreNextReset() {
+        if (mIgnoreResetState == NOT_IGNORING_RESET) {
+            mIgnoreResetState = IGNORING_NEXT_RESET;
+        }
+    }
+
+    /**
+     * Indicates that the bridge should ignore all subsequent calls to {@link #reset} until
+     * {@link #stopIgnoringReset()} is called.
+     */
+    void startIgnoringReset() {
+        mIgnoreResetState = IGNORING_RESET;
+    }
+
+    /**
+     * When called after {@link #ignoreNextReset()} or {@link #startIgnoringReset()}, allows
+     * subsequent calls to {@link #reset} to go through as normal, until either is called again.
+     */
+    void stopIgnoringReset() {
+        mIgnoreResetState = NOT_IGNORING_RESET;
+    }
+
+    /**
+     * Clears all data associated with the bridge, returning it to its default state.
+     *
+     * Note that calls to this method may be ignored if {@link #ignoreNextReset()} or
+     * {@link #startIgnoringReset()} has been called without a corresponding call to
+     * {@link #stopIgnoringReset()}.
+     */
+    void reset() {
+        if (mIgnoreResetState == IGNORING_RESET) {
+            return;
+        }
+
+        if (mIgnoreResetState == IGNORING_NEXT_RESET) {
+            stopIgnoringReset();
+            return;
+        }
+
+        mBiometricFragment = null;
+        mFingerprintDialogFragment = null;
+        mFingerprintHelperFragment = null;
+        mExecutor = null;
+        mOnClickListener = null;
+        mAuthenticationCallback = null;
+        sInstance = null;
+    }
+}
diff --git a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
index a46d54c..286958a 100644
--- a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
+++ b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
@@ -16,9 +16,12 @@
 
 package androidx.biometric;
 
+import android.annotation.SuppressLint;
 import android.app.Dialog;
+import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.graphics.drawable.AnimatedVectorDrawable;
@@ -27,29 +30,35 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.app.AlertDialog;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentActivity;
 
 /**
  * This class implements a custom AlertDialog that prompts the user for fingerprint authentication.
  * This class is not meant to be preserved across process death; for security reasons, the
  * BiometricPromptCompat will automatically dismiss the dialog when the activity is no longer in the
  * foreground.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
+@SuppressLint("SyntheticAccessor")
 public class FingerprintDialogFragment extends DialogFragment {
 
-    private static final String TAG = "FingerprintDialogFragment";
+    private static final String TAG = "FingerprintDialogFrag";
     private static final String KEY_DIALOG_BUNDLE = "SavedBundle";
 
     /**
@@ -58,21 +67,21 @@
      * Error messages will be propagated back to the application via AuthenticationCallback
      * after this amount of time.
      */
-    protected static final int HIDE_DIALOG_DELAY = 2000; // ms
+    static final int HIDE_DIALOG_DELAY = 2000; // ms
 
     // Shows a temporary message in the help area
-    protected static final int MSG_SHOW_HELP = 1;
+    static final int MSG_SHOW_HELP = 1;
     // Show an error in the help area, and dismiss the dialog afterwards
-    protected static final int MSG_SHOW_ERROR = 2;
+    static final int MSG_SHOW_ERROR = 2;
     // Dismisses the authentication dialog
-    protected static final int MSG_DISMISS_DIALOG_ERROR = 3;
+    static final int MSG_DISMISS_DIALOG_ERROR = 3;
     // Resets the help message
-    protected static final int MSG_RESET_MESSAGE = 4;
+    static final int MSG_RESET_MESSAGE = 4;
     // Dismisses the authentication dialog after success.
-    protected static final int MSG_DISMISS_DIALOG_AUTHENTICATED = 5;
+    static final int MSG_DISMISS_DIALOG_AUTHENTICATED = 5;
     // The amount of time required that this fragment be displayed for in order that
     // we show an error message on top of the UI.
-    protected static final int DISPLAYED_FOR_500_MS = 6;
+    static final int DISPLAYED_FOR_500_MS = 6;
 
     // States for icon animation
     private static final int STATE_NONE = 0;
@@ -83,7 +92,7 @@
     /**
      * Creates a dialog requesting for Fingerprint authentication.
      */
-    public static FingerprintDialogFragment newInstance() {
+    static FingerprintDialogFragment newInstance() {
         FingerprintDialogFragment fragment = new FingerprintDialogFragment();
         return fragment;
     }
@@ -123,20 +132,79 @@
     private TextView mErrorText;
 
     private Context mContext;
-    private Dialog mDialog;
+
     /**
      * This flag is used to control the instant dismissal of the dialog fragment. In the case where
      * the user is already locked out this dialog will not appear. In the case where the user is
      * being locked out for the first time an error message will be displayed on the UI before
      * dismissing.
      */
-    protected boolean mDismissInstantly = true;
+    private boolean mDismissInstantly = true;
 
     // This should be re-set by the BiometricPromptCompat each time the lifecycle changes.
-    DialogInterface.OnClickListener mNegativeButtonListener;
+    private DialogInterface.OnClickListener mNegativeButtonListener;
+
+    // Also created once and retained.
+    @SuppressWarnings("deprecation")
+    private final DialogInterface.OnClickListener mDeviceCredentialButtonListener =
+            (dialog, which) -> {
+                if (which == DialogInterface.BUTTON_NEGATIVE) {
+                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+                        Log.e(TAG, "Failed to check device credential. Not supported prior to L.");
+                        return;
+                    }
+
+                    final FragmentActivity activity = getActivity();
+                    if (!(activity instanceof DeviceCredentialHandlerActivity)) {
+                        Log.e(TAG, "Failed to check device credential. Parent handler not found.");
+                        return;
+                    }
+
+                    final Object service = activity.getSystemService(Context.KEYGUARD_SERVICE);
+                    if (!(service instanceof KeyguardManager)) {
+                        Log.e(TAG, "Failed to check device credential. KeyguardManager not found.");
+                        return;
+                    }
+                    final KeyguardManager km = (KeyguardManager) service;
+
+                    // Dismiss the fingerprint dialog without forwarding errors to the client.
+                    final FingerprintHelperFragment fingerprintHelperFragment =
+                            (FingerprintHelperFragment) getFragmentManager().findFragmentByTag(
+                                    BiometricPrompt.FINGERPRINT_HELPER_FRAGMENT_TAG);
+                    if (fingerprintHelperFragment != null) {
+                        fingerprintHelperFragment.setConfirmingDeviceCredential(true);
+                    }
+                    onCancel(dialog);
+
+                    // Pass along the title and subtitle from the biometric prompt.
+                    final CharSequence title;
+                    final CharSequence subtitle;
+                    if (mBundle != null) {
+                        title = mBundle.getCharSequence(BiometricPrompt.KEY_TITLE);
+                        subtitle = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE);
+                    } else {
+                        title = null;
+                        subtitle = null;
+                    }
+
+                    // Prevent the bridge from resetting until the confirmation activity finishes.
+                    DeviceCredentialHandlerBridge bridge =
+                            DeviceCredentialHandlerBridge.getInstanceIfNotNull();
+                    if (bridge != null) {
+                        bridge.startIgnoringReset();
+                    }
+
+                    // Launch a new instance of the confirm device credential Settings activity.
+                    final Intent intent = km.createConfirmDeviceCredentialIntent(title, subtitle);
+                    intent.setFlags(
+                            Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+                    activity.startActivityForResult(intent, 0 /* requestCode */);
+                }
+            };
 
     @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
+    @NonNull
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         if (savedInstanceState != null && mBundle == null) {
             mBundle = savedInstanceState.getBundle(KEY_DIALOG_BUNDLE);
         }
@@ -174,30 +242,33 @@
         mErrorText = layout.findViewById(R.id.fingerprint_error);
 
         final CharSequence negativeButtonText =
-                mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
-        builder.setNegativeButton(negativeButtonText, new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialog, int which) {
-                if (mNegativeButtonListener != null) {
-                    mNegativeButtonListener.onClick(dialog, which);
-                }
+                isDeviceCredentialAllowed()
+                        ? getString(R.string.confirm_device_credential_password)
+                        : mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
+        builder.setNegativeButton(negativeButtonText, (dialog, which) -> {
+            if (isDeviceCredentialAllowed()) {
+                mDeviceCredentialButtonListener.onClick(dialog, which);
+            } else if (mNegativeButtonListener != null) {
+                mNegativeButtonListener.onClick(dialog, which);
+            } else {
+                Log.w(TAG, "No suitable negative button listener.");
             }
         });
 
         builder.setView(layout);
-        mDialog = builder.create();
-        mDialog.setCanceledOnTouchOutside(false);
-        return mDialog;
+        Dialog dialog = builder.create();
+        dialog.setCanceledOnTouchOutside(false);
+        return dialog;
     }
 
     @Override
-    public void onSaveInstanceState(Bundle outState) {
+    public void onSaveInstanceState(@NonNull Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putBundle(KEY_DIALOG_BUNDLE, mBundle);
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mContext = getContext();
 
@@ -224,9 +295,9 @@
     }
 
     @Override
-    public void onCancel(DialogInterface dialog) {
+    public void onCancel(@NonNull DialogInterface dialog) {
         super.onCancel(dialog);
-        FingerprintHelperFragment fingerprintHelperFragment = (FingerprintHelperFragment)
+        final FingerprintHelperFragment fingerprintHelperFragment = (FingerprintHelperFragment)
                 getFragmentManager()
                         .findFragmentByTag(BiometricPrompt.FINGERPRINT_HELPER_FRAGMENT_TAG);
         if (fingerprintHelperFragment != null) {
@@ -234,7 +305,7 @@
         }
     }
 
-    public void setBundle(Bundle bundle) {
+    public void setBundle(@NonNull Bundle bundle) {
         mBundle = bundle;
     }
 
@@ -254,27 +325,27 @@
      * the dialog persists through rotation, this allows us to return this as the error text for
      * ERROR_NEGATIVE_BUTTON.
      */
+    @Nullable
     protected CharSequence getNegativeButtonText() {
         return mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT);
     }
 
-    /**
-     * Sets the negative button listener.
-     * @param listener
-     */
-    protected void setNegativeButtonListener(DialogInterface.OnClickListener listener) {
+    void setNegativeButtonListener(DialogInterface.OnClickListener listener) {
         mNegativeButtonListener = listener;
     }
 
     /**
-     * Returns the handler; the handler is used by FingerprintHelperFragment to notify the UI of
+     * @return The handler; the handler is used by FingerprintHelperFragment to notify the UI of
      * changes from Fingerprint callbacks.
-     * @return
      */
-    protected Handler getHandler() {
+    Handler getHandler() {
         return mHandler;
     }
 
+    boolean isDeviceCredentialAllowed() {
+        return mBundle.getBoolean(BiometricPrompt.KEY_ALLOW_DEVICE_CREDENTIAL);
+    }
+
     private boolean shouldAnimateForTransition(int oldState, int newState) {
         if (oldState == STATE_NONE && newState == STATE_FINGERPRINT) {
             return false;
@@ -289,7 +360,7 @@
         return false;
     }
 
-    @RequiresApi(21)
+    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
     private Drawable getAnimationForTransition(int oldState, int newState) {
         int iconRes;
 
@@ -332,7 +403,7 @@
         }
     }
 
-    void handleShowHelp(CharSequence msg) {
+    private void handleShowHelp(CharSequence msg) {
         updateFingerprintIcon(STATE_FINGERPRINT_ERROR);
         mHandler.removeMessages(MSG_RESET_MESSAGE);
         mErrorText.setTextColor(mErrorColor);
@@ -342,7 +413,7 @@
         mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RESET_MESSAGE), HIDE_DIALOG_DELAY);
     }
 
-    void handleShowError(int errMsgId, CharSequence msg) {
+    private void handleShowError(int errMsgId, CharSequence msg) {
         updateFingerprintIcon(STATE_FINGERPRINT_ERROR);
         mHandler.removeMessages(MSG_RESET_MESSAGE);
         mErrorText.setTextColor(mErrorColor);
@@ -353,19 +424,13 @@
                 HIDE_DIALOG_DELAY);
     }
 
-    void dismissAfterDelay() {
+    private void dismissAfterDelay() {
         mErrorText.setTextColor(mErrorColor);
-        mErrorText.setText(
-                R.string.fingerprint_error_lockout);
-        mHandler.postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                dismiss();
-            }
-        }, HIDE_DIALOG_DELAY);
+        mErrorText.setText(R.string.fingerprint_error_lockout);
+        mHandler.postDelayed(this::dismiss, HIDE_DIALOG_DELAY);
     }
 
-    void handleDismissDialogError() {
+    private void handleDismissDialogError() {
         if (mDismissInstantly) {
             dismiss();
         } else {
@@ -376,7 +441,7 @@
         mDismissInstantly = true;
     }
 
-    void handleResetMessage() {
+    private void handleResetMessage() {
         updateFingerprintIcon(STATE_FINGERPRINT);
         mErrorText.setTextColor(mTextColor);
         mErrorText.setText(mContext.getString(R.string.fingerprint_dialog_touch_sensor));
diff --git a/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java b/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java
index 219e3c4..173c607 100644
--- a/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java
+++ b/biometric/src/main/java/androidx/biometric/FingerprintHelperFragment.java
@@ -16,6 +16,7 @@
 
 package androidx.biometric;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Handler;
@@ -24,9 +25,12 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.os.CancellationSignal;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
 
 import java.util.concurrent.Executor;
 
@@ -35,34 +39,39 @@
  * across device configuration changes. This class is not meant to be preserved after process death;
  * for security reasons, the BiometricPromptCompat will automatically stop authentication when the
  * activity is no longer in the foreground.
+ *
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
+@SuppressLint("SyntheticAccessor")
 public class FingerprintHelperFragment extends Fragment {
 
-    private static final String TAG = "fh_fragment";
+    private static final String TAG = "FingerprintHelperFrag";
 
-    protected static final int USER_CANCELED_FROM_NONE = 0;
-    protected static final int USER_CANCELED_FROM_USER = 1;
-    protected static final int USER_CANCELED_FROM_NEGATIVE_BUTTON = 2;
+    static final int USER_CANCELED_FROM_NONE = 0;
+    static final int USER_CANCELED_FROM_USER = 1;
+    static final int USER_CANCELED_FROM_NEGATIVE_BUTTON = 2;
 
     // Re-set by the application, through BiometricPromptCompat upon orientation changes.
-    Executor mExecutor;
-    BiometricPrompt.AuthenticationCallback mClientAuthenticationCallback;
+    private Executor mExecutor;
+    private BiometricPrompt.AuthenticationCallback mClientAuthenticationCallback;
 
     // Re-set by BiometricPromptCompat upon orientation changes. This handler is used to send
     // messages from the AuthenticationCallbacks to the UI.
-    Handler mHandler;
+    private Handler mHandler;
 
     // Set once and retained.
     private boolean mShowing;
     private BiometricPrompt.CryptoObject mCryptoObject;
 
     // Created once and retained.
-    Context mContext;
-    int mCanceledFrom;
+    private Context mContext;
+    private int mCanceledFrom;
     private CancellationSignal mCancellationSignal;
 
+    // Whether this fragment is launching the confirm device credential Settings activity.
+    private boolean mConfirmingDeviceCredential;
+
     // Also created once and retained.
     @SuppressWarnings("deprecation")
     private final androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback
@@ -73,13 +82,11 @@
                         final CharSequence errString) {
                     mHandler.obtainMessage(FingerprintDialogFragment.MSG_DISMISS_DIALOG_ERROR)
                             .sendToTarget();
-                    mExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            mClientAuthenticationCallback
-                                    .onAuthenticationError(errMsgId, errString);
-                        }
-                    });
+                    if (!mConfirmingDeviceCredential) {
+                        mExecutor.execute(
+                                () -> mClientAuthenticationCallback.onAuthenticationError(errMsgId,
+                                        errString));
+                    }
                 }
 
                 @Override
@@ -110,18 +117,12 @@
 
                         mHandler.obtainMessage(FingerprintDialogFragment.MSG_SHOW_ERROR,
                                 errMsgIdToSend, 0, errStringNonNull).sendToTarget();
-                        mHandler.postDelayed(new Runnable() {
-                            @Override
-                            public void run() {
-                                mExecutor.execute(new Runnable() {
-                                    @Override
-                                    public void run() {
-                                        mClientAuthenticationCallback.onAuthenticationError(
-                                                errMsgIdToSend, errStringNonNull);
-                                    }
-                                });
-                            }
-                        }, FingerprintDialogFragment.HIDE_DIALOG_DELAY);
+                        if (!mConfirmingDeviceCredential) {
+                            mHandler.postDelayed(() -> mExecutor.execute(
+                                    () -> mClientAuthenticationCallback.onAuthenticationError(
+                                            errMsgIdToSend, errStringNonNull)),
+                                    FingerprintDialogFragment.HIDE_DIALOG_DELAY);
+                        }
                     }
                     cleanup();
                 }
@@ -140,14 +141,9 @@
                     mHandler.obtainMessage(
                             FingerprintDialogFragment.MSG_DISMISS_DIALOG_AUTHENTICATED)
                             .sendToTarget();
-                    mExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            mClientAuthenticationCallback.onAuthenticationSucceeded(
-                                    new BiometricPrompt.AuthenticationResult(
-                                            unwrapCryptoObject(result.getCryptoObject())));
-                        }
-                    });
+                    mExecutor.execute(() -> mClientAuthenticationCallback.onAuthenticationSucceeded(
+                            new BiometricPrompt.AuthenticationResult(
+                                    unwrapCryptoObject(result.getCryptoObject()))));
                     cleanup();
                 }
 
@@ -156,19 +152,14 @@
                     mHandler.obtainMessage(FingerprintDialogFragment.MSG_SHOW_HELP,
                             mContext.getResources().getString(R.string.fingerprint_not_recognized))
                             .sendToTarget();
-                    mExecutor.execute(new Runnable() {
-                        @Override
-                        public void run() {
-                            mClientAuthenticationCallback.onAuthenticationFailed();
-                        }
-                    });
+                    mExecutor.execute(mClientAuthenticationCallback::onAuthenticationFailed);
                 }
             };
 
     /**
      * Creates a new instance of the {@link FingerprintHelperFragment}.
      */
-    public static FingerprintHelperFragment newInstance() {
+    static FingerprintHelperFragment newInstance() {
         return new FingerprintHelperFragment();
     }
 
@@ -176,22 +167,22 @@
      * Sets the crypto object to be associated with the authentication. Should be called before
      * adding the fragment to guarantee that it's ready in onCreate().
      */
-    public void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
+    void setCryptoObject(BiometricPrompt.CryptoObject crypto) {
         mCryptoObject = crypto;
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
+    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setRetainInstance(true);
         mContext = getContext();
-
     }
 
     @Override
     @SuppressWarnings("deprecation")
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
+    @Nullable
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
         if (!mShowing) {
             mCancellationSignal = new CancellationSignal();
             mCanceledFrom = USER_CANCELED_FROM_NONE;
@@ -218,7 +209,7 @@
      * Sets the client's callback. This should be done whenever the lifecycle changes (orientation
      * changes).
      */
-    protected void setCallback(Executor executor,
+    void setCallback(Executor executor,
             BiometricPrompt.AuthenticationCallback callback) {
         mExecutor = executor;
         mClientAuthenticationCallback = callback;
@@ -227,15 +218,23 @@
     /**
      * Pass a reference to the handler used by FingerprintDialogFragment to update the UI.
      */
-    protected void setHandler(Handler handler) {
+    void setHandler(Handler handler) {
         mHandler = handler;
     }
 
     /**
+     * Indicates whether this fragment has or is about to launch the confirm device credential
+     * Settings activity and should therefore stop sending error signals back to the client.
+     */
+    void setConfirmingDeviceCredential(boolean confirmingDeviceCredential) {
+        mConfirmingDeviceCredential = confirmingDeviceCredential;
+    }
+
+    /**
      * Cancel the authentication.
      * @param canceledFrom one of the USER_CANCELED_FROM* constants
      */
-    protected void cancel(int canceledFrom) {
+    void cancel(int canceledFrom) {
         mCanceledFrom = canceledFrom;
         if (canceledFrom == USER_CANCELED_FROM_USER) {
             sendErrorToClient(BiometricPrompt.ERROR_USER_CANCELED);
@@ -250,11 +249,15 @@
     /**
      * Remove the fragment so that resources can be freed.
      */
-    void cleanup() {
+    private void cleanup() {
         mShowing = false;
+        FragmentActivity activity = getActivity();
         if (getFragmentManager() != null) {
             getFragmentManager().beginTransaction().detach(this).commitAllowingStateLoss();
         }
+        if (!mConfirmingDeviceCredential) {
+            Utils.maybeFinishHandler(activity);
+        }
     }
 
     /**
@@ -277,10 +280,14 @@
     /**
      * Bypasses the FingerprintManager authentication callback wrapper and sends it directly to the
      * client's callback, since the UI is not even showing yet.
-     * @param error
+     *
+     * @param error The error code that will be sent to the client.
      */
     private void sendErrorToClient(final int error) {
-        mClientAuthenticationCallback.onAuthenticationError(error, getErrorString(mContext, error));
+        if (!mConfirmingDeviceCredential) {
+            mClientAuthenticationCallback.onAuthenticationError(error,
+                    getErrorString(mContext, error));
+        }
     }
 
     /**
@@ -304,7 +311,7 @@
     }
 
     @SuppressWarnings("deprecation")
-    static BiometricPrompt.CryptoObject unwrapCryptoObject(
+    private static BiometricPrompt.CryptoObject unwrapCryptoObject(
             androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject cryptoObject) {
         if (cryptoObject == null) {
             return null;
@@ -320,7 +327,7 @@
     }
 
     @SuppressWarnings("deprecation")
-    static androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject
+    private static androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject
             wrapCryptoObject(BiometricPrompt.CryptoObject cryptoObject) {
         if (cryptoObject == null) {
             return null;
diff --git a/biometric/src/main/java/androidx/biometric/Utils.java b/biometric/src/main/java/androidx/biometric/Utils.java
index 5782399..0fa34f91 100644
--- a/biometric/src/main/java/androidx/biometric/Utils.java
+++ b/biometric/src/main/java/androidx/biometric/Utils.java
@@ -16,7 +16,9 @@
 
 package androidx.biometric;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.fragment.app.FragmentActivity;
 
 /**
  * @hide
@@ -48,4 +50,14 @@
                 return true;
         }
     }
+
+    /**
+     * Finishes a given activity if and only if it's a {@link DeviceCredentialHandlerActivity}.
+     * @param activity The activity to finish.
+     */
+    public static void maybeFinishHandler(@Nullable FragmentActivity activity) {
+        if (activity instanceof DeviceCredentialHandlerActivity && !activity.isFinishing()) {
+            activity.finish();
+        }
+    }
 }
diff --git a/browser/build.gradle b/browser/build.gradle
index 06018de..5dd3789 100644
--- a/browser/build.gradle
+++ b/browser/build.gradle
@@ -17,7 +17,7 @@
 }
 
 dependencies {
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     api("androidx.annotation:annotation:1.1.0")
 
     implementation("androidx.collection:collection:1.1.0")
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index b4bd916..d0311b6 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -33,7 +33,7 @@
     val ASYNCLAYOUTINFLATER = Version("1.1.0-alpha01")
     val AUTOFILL = Version("1.0.0-alpha03")
     val BENCHMARK = Version("1.0.0-alpha05")
-    val BIOMETRIC = Version("1.0.0-beta01")
+    val BIOMETRIC = Version("1.0.0-alpha06")
     val BROWSER = Version("1.2.0-alpha08")
     val CAMERA = Version("1.0.0-alpha05")
     val CAMERA_EXTENSIONS = Version("1.0.0-alpha02")
@@ -87,10 +87,10 @@
     val PERCENTLAYOUT = Version("1.1.0-alpha01")
     val PREFERENCE = Version("1.2.0-alpha01")
     val RECOMMENDATION = Version("1.1.0-alpha01")
-    val RECYCLERVIEW = Version("1.1.0-beta03")
+    val RECYCLERVIEW = Version("1.1.0-beta04")
     val RECYCLERVIEW_SELECTION = Version("1.1.0-alpha07")
     val REMOTECALLBACK = Version("1.0.0-alpha02")
-    val ROOM = Version("2.2.0-alpha03")
+    val ROOM = Version("2.2.0-beta01")
     val SAVEDSTATE = Version("1.0.0-rc01")
     val SECURITY = Version("1.0.0-alpha03")
     val SECURITY_IDENTITY_CREDENTIAL = Version("1.0.0-alpha01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index b0b0c27..9c03f27 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -31,7 +31,7 @@
     prebuilts(LibraryGroups.ACTIVITY, "1.1.0-alpha02")
     prebuilts(LibraryGroups.ADS, "1.0.0-alpha01")
     prebuilts(LibraryGroups.ANNOTATION, "annotation", "1.1.0")
-    prebuilts(LibraryGroups.APPCOMPAT, "1.1.0-rc01")
+    prebuilts(LibraryGroups.APPCOMPAT, "1.1.0")
     prebuilts(LibraryGroups.ARCH_CORE, "2.1.0")
     prebuilts(LibraryGroups.ASYNCLAYOUTINFLATER, "1.0.0")
     prebuilts(LibraryGroups.AUTOFILL, "1.0.0-alpha02")
@@ -79,10 +79,10 @@
     ignore(LibraryGroups.LOADER.group, "loader-ktx")
     prebuilts(LibraryGroups.LOADER, "1.1.0-rc01")
     prebuilts(LibraryGroups.LOCALBROADCASTMANAGER, "1.1.0-alpha01")
-    prebuilts(LibraryGroups.MEDIA, "media", "1.1.0-rc01")
+    prebuilts(LibraryGroups.MEDIA, "media", "1.1.0")
     ignore(LibraryGroups.MEDIA2.group, "media2-exoplayer")
-    prebuilts(LibraryGroups.MEDIA2, "media2-widget", "1.0.0-beta01")
-    prebuilts(LibraryGroups.MEDIA2, "1.0.0-rc01")
+    prebuilts(LibraryGroups.MEDIA2, "media2-widget", "1.0.0-rc02")
+    prebuilts(LibraryGroups.MEDIA2, "1.0.0-rc02")
     prebuilts(LibraryGroups.MEDIAROUTER, "1.1.0-rc01")
     ignore(LibraryGroups.NAVIGATION.group, "navigation-testing")
     ignore(LibraryGroups.NAVIGATION.group, "navigation-dynamic-feature")
@@ -99,7 +99,7 @@
     prebuilts(LibraryGroups.RECYCLERVIEW, "recyclerview", "1.1.0-beta03")
     prebuilts(LibraryGroups.RECYCLERVIEW, "recyclerview-selection", "1.1.0-alpha06")
     prebuilts(LibraryGroups.REMOTECALLBACK, "1.0.0-alpha02")
-    prebuilts(LibraryGroups.ROOM, "2.2.0-alpha02")
+    prebuilts(LibraryGroups.ROOM, "2.2.0-beta01")
     prebuilts(LibraryGroups.SAVEDSTATE, "1.0.0")
     // TODO: Remove this ignore once androidx.security:security-identity-credential:1.0.0-alpha01 is released
     ignore(LibraryGroups.SECURITY.group, "security-identity-credential")
@@ -118,8 +118,8 @@
     prebuilts(LibraryGroups.TEXTCLASSIFIER, "1.0.0-alpha02")
     prebuilts(LibraryGroups.TRANSITION, "1.2.0-beta01")
     prebuilts(LibraryGroups.TVPROVIDER, "1.0.0")
-    prebuilts(LibraryGroups.VECTORDRAWABLE, "1.1.0-rc01")
-    prebuilts(LibraryGroups.VECTORDRAWABLE, "vectordrawable-animated", "1.1.0-rc01")
+    prebuilts(LibraryGroups.VECTORDRAWABLE, "1.1.0")
+    prebuilts(LibraryGroups.VECTORDRAWABLE, "vectordrawable-animated", "1.1.0")
     prebuilts(LibraryGroups.VERSIONEDPARCELABLE, "1.1.0")
     prebuilts(LibraryGroups.VIEWPAGER, "1.0.0")
     prebuilts(LibraryGroups.VIEWPAGER2, "1.0.0-beta03")
@@ -128,7 +128,7 @@
     prebuilts(LibraryGroups.WEBKIT, "1.1.0-alpha02")
     ignore(LibraryGroups.WORK.group, "work-gcm")
     ignore(LibraryGroups.WORK.group, "work-foreground")
-    prebuilts(LibraryGroups.WORK, "2.2.0")
+    prebuilts(LibraryGroups.WORK, "2.3.0-alpha01")
     default(Ignore)
 }
 
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
index 1067c50..edc6fa0 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
@@ -186,7 +186,9 @@
     // Never track @Experimental APIs.
     args += listOf(
         "--hide-annotation", "androidx.annotation.experimental.Experimental",
-        "--hide-meta-annotation", "androidx.annotation.experimental.Experimental"
+        "--hide-annotation", "kotlin.Experimental",
+        "--hide-meta-annotation", "androidx.annotation.experimental.Experimental",
+        "--hide-meta-annotation", "kotlin.Experimental"
     )
 
     val metalavaConfiguration = getMetalavaConfiguration()
diff --git a/camera/camera-camera2/build.gradle b/camera/camera-camera2/build.gradle
index 2a15464..b13de44 100644
--- a/camera/camera-camera2/build.gradle
+++ b/camera/camera-camera2/build.gradle
@@ -27,7 +27,7 @@
 dependencies {
     api(project(":camera:camera-core"))
 
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation("androidx.annotation:annotation:1.0.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
     implementation(GUAVA_LISTENABLE_FUTURE)
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java
index 3f31ab0..b337735 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageReaderProxysTest.java
@@ -25,10 +25,9 @@
 import android.os.HandlerThread;
 import android.util.Size;
 
-import androidx.camera.core.AppConfig;
+import androidx.camera.camera2.impl.Camera2CameraFactory;
 import androidx.camera.core.BaseCamera;
 import androidx.camera.core.CameraFactory;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.ImageReaderProxy;
 import androidx.camera.core.ImageReaderProxys;
@@ -44,6 +43,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -51,6 +51,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Semaphore;
 
 /**
@@ -60,7 +61,8 @@
 @RunWith(AndroidJUnit4.class)
 public final class ImageReaderProxysTest {
     private static final String CAMERA_ID = "0";
-    private static final int TEST_TIMEOUT_MILLIS = 3000;
+
+    private static CameraFactory sCameraFactory;
 
     private BaseCamera mCamera;
     private HandlerThread mHandlerThread;
@@ -81,27 +83,37 @@
         };
     }
 
+    @BeforeClass
+    public static void initializeFactory() {
+        Context context = ApplicationProvider.getApplicationContext();
+        sCameraFactory = new Camera2CameraFactory(context);
+    }
+
     @Before
     public void setUp() {
         assumeTrue(CameraUtil.deviceHasCamera());
-        Context context = ApplicationProvider.getApplicationContext();
-        AppConfig appConfig = Camera2AppConfig.create(context);
-        CameraFactory cameraFactory = appConfig.getCameraFactory(null);
-        CameraX.init(context, appConfig);
-        mCamera = cameraFactory.getCamera(CAMERA_ID);
+
         mHandlerThread = new HandlerThread("Background");
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
         mReaders = new ArrayList<>();
+
+        // Grab the camera so we can wait for release in tearDown()
+
+        mCamera = sCameraFactory.getCamera(CAMERA_ID);
     }
 
     @After
-    public void tearDown() {
+    public void tearDown() throws ExecutionException, InterruptedException {
         for (ImageReaderProxy reader : mReaders) {
             reader.close();
         }
-        if (mCamera != null && mHandlerThread != null) {
-            mCamera.release();
+
+        if (mCamera != null) {
+            mCamera.release().get();
+        }
+
+        if (mHandlerThread != null) {
             mHandlerThread.quitSafely();
         }
     }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java
index 20ff7d5..9cb9210 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureCallbacks.java
@@ -24,6 +24,7 @@
 import android.os.Build;
 import android.view.Surface;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
@@ -43,6 +44,7 @@
     }
 
     /** Returns a session capture callback which does nothing. */
+    @NonNull
     public static CameraCaptureSession.CaptureCallback createNoOpCallback() {
         return new NoOpSessionCaptureCallback();
     }
@@ -54,8 +56,9 @@
     }
 
     /** Returns a session capture callback which calls a list of other callbacks. */
+    @NonNull
     public static CameraCaptureSession.CaptureCallback createComboCallback(
-            CameraCaptureSession.CaptureCallback... callbacks) {
+            @NonNull CameraCaptureSession.CaptureCallback... callbacks) {
         return createComboCallback(Arrays.asList(callbacks));
     }
 
@@ -63,41 +66,45 @@
             extends CameraCaptureSession.CaptureCallback {
         @Override
         public void onCaptureBufferLost(
-                CameraCaptureSession session,
-                CaptureRequest request,
-                Surface surface,
+                @NonNull CameraCaptureSession session,
+                @NonNull CaptureRequest request,
+                @NonNull Surface surface,
                 long frame) {
         }
 
         @Override
         public void onCaptureCompleted(
-                CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                @NonNull TotalCaptureResult result) {
         }
 
         @Override
         public void onCaptureFailed(
-                CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                @NonNull CaptureFailure failure) {
         }
 
         @Override
         public void onCaptureProgressed(
-                CameraCaptureSession session,
-                CaptureRequest request,
-                CaptureResult partialResult) {
+                @NonNull CameraCaptureSession session,
+                @NonNull CaptureRequest request,
+                @NonNull CaptureResult partialResult) {
         }
 
         @Override
-        public void onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId) {
+        public void onCaptureSequenceAborted(@NonNull CameraCaptureSession session,
+                int sequenceId) {
         }
 
         @Override
         public void onCaptureSequenceCompleted(
-                CameraCaptureSession session, int sequenceId, long frame) {
+                @NonNull CameraCaptureSession session, int sequenceId, long frame) {
         }
 
         @Override
         public void onCaptureStarted(
-                CameraCaptureSession session, CaptureRequest request, long timestamp, long frame) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                long timestamp, long frame) {
         }
     }
 
@@ -117,7 +124,8 @@
         @RequiresApi(api = Build.VERSION_CODES.N)
         @Override
         public void onCaptureBufferLost(
-                CameraCaptureSession session, CaptureRequest request, Surface surface, long frame) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                @NonNull Surface surface, long frame) {
             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
                 callback.onCaptureBufferLost(session, request, surface, frame);
             }
@@ -125,7 +133,8 @@
 
         @Override
         public void onCaptureCompleted(
-                CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                @NonNull TotalCaptureResult result) {
             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
                 callback.onCaptureCompleted(session, request, result);
             }
@@ -133,7 +142,8 @@
 
         @Override
         public void onCaptureFailed(
-                CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                @NonNull CaptureFailure failure) {
             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
                 callback.onCaptureFailed(session, request, failure);
             }
@@ -141,14 +151,16 @@
 
         @Override
         public void onCaptureProgressed(
-                CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                @NonNull CaptureResult partialResult) {
             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
                 callback.onCaptureProgressed(session, request, partialResult);
             }
         }
 
         @Override
-        public void onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId) {
+        public void onCaptureSequenceAborted(@NonNull CameraCaptureSession session,
+                int sequenceId) {
             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
                 callback.onCaptureSequenceAborted(session, sequenceId);
             }
@@ -156,7 +168,7 @@
 
         @Override
         public void onCaptureSequenceCompleted(
-                CameraCaptureSession session, int sequenceId, long frame) {
+                @NonNull CameraCaptureSession session, int sequenceId, long frame) {
             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
                 callback.onCaptureSequenceCompleted(session, sequenceId, frame);
             }
@@ -164,7 +176,8 @@
 
         @Override
         public void onCaptureStarted(
-                CameraCaptureSession session, CaptureRequest request, long timestamp, long frame) {
+                @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+                long timestamp, long frame) {
             for (CameraCaptureSession.CaptureCallback callback : mCallbacks) {
                 callback.onCaptureStarted(session, request, timestamp, frame);
             }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java
index d2dd131..82622c7 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2Initializer.java
@@ -23,6 +23,7 @@
 import android.net.Uri;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.camera.camera2.Camera2AppConfig;
@@ -48,7 +49,7 @@
     @Nullable
     @Override
     public Cursor query(
-            Uri uri,
+            @NonNull Uri uri,
             @Nullable String[] strings,
             @Nullable String s,
             @Nullable String[] strings1,
@@ -58,24 +59,24 @@
 
     @Nullable
     @Override
-    public String getType(Uri uri) {
+    public String getType(@NonNull Uri uri) {
         return null;
     }
 
     @Nullable
     @Override
-    public Uri insert(Uri uri, @Nullable ContentValues contentValues) {
+    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
         return null;
     }
 
     @Override
-    public int delete(Uri uri, @Nullable String s, @Nullable String[] strings) {
+    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
         return 0;
     }
 
     @Override
     public int update(
-            Uri uri,
+            @NonNull Uri uri,
             @Nullable ContentValues contentValues,
             @Nullable String s,
             @Nullable String[] strings) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java
index ba38457..c881b2c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraBurstCaptureCallback.java
@@ -53,7 +53,8 @@
     @RequiresApi(api = Build.VERSION_CODES.N)
     @Override
     public void onCaptureBufferLost(
-            CameraCaptureSession session, CaptureRequest request, Surface surface, long frame) {
+            @NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
+            @NonNull Surface surface, long frame) {
         for (CameraCaptureSession.CaptureCallback callback : getCallbacks(request)) {
             callback.onCaptureBufferLost(session, request, surface, frame);
         }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
index a5187c8d..3955a31 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallbacks.java
@@ -40,15 +40,18 @@
     }
 
     /** Returns a camera event callback which calls a list of other callbacks. */
+    @NonNull
     public ComboCameraEventCallback createComboCallback() {
         return new ComboCameraEventCallback(getAllItems());
     }
 
     /** Returns a camera event callback which does nothing. */
+    @NonNull
     public static CameraEventCallbacks createEmptyCallback() {
         return new CameraEventCallbacks();
     }
 
+    @NonNull
     @Override
     public MultiValueSet<CameraEventCallback> clone() {
         CameraEventCallbacks ret = createEmptyCallback();
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index d792fc0..b111e0d 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -29,7 +29,7 @@
     api("androidx.lifecycle:lifecycle-common:2.0.0")
     implementation("androidx.exifinterface:exifinterface:1.0.0")
     implementation("androidx.annotation:annotation:1.0.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
     implementation(ARCH_LIFECYCLE_LIVEDATA)
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java
index d27affa..89a1302 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraDeviceStateCallbacks.java
@@ -18,6 +18,7 @@
 
 import android.hardware.camera2.CameraDevice;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
@@ -65,19 +66,19 @@
 
     static final class NoOpDeviceStateCallback extends CameraDevice.StateCallback {
         @Override
-        public void onOpened(CameraDevice cameraDevice) {
+        public void onOpened(@NonNull CameraDevice cameraDevice) {
         }
 
         @Override
-        public void onClosed(CameraDevice cameraDevice) {
+        public void onClosed(@NonNull CameraDevice cameraDevice) {
         }
 
         @Override
-        public void onDisconnected(CameraDevice cameraDevice) {
+        public void onDisconnected(@NonNull CameraDevice cameraDevice) {
         }
 
         @Override
-        public void onError(CameraDevice cameraDevice, int error) {
+        public void onError(@NonNull CameraDevice cameraDevice, int error) {
         }
     }
 
@@ -94,28 +95,28 @@
         }
 
         @Override
-        public void onOpened(CameraDevice cameraDevice) {
+        public void onOpened(@NonNull CameraDevice cameraDevice) {
             for (CameraDevice.StateCallback callback : mCallbacks) {
                 callback.onOpened(cameraDevice);
             }
         }
 
         @Override
-        public void onClosed(CameraDevice cameraDevice) {
+        public void onClosed(@NonNull CameraDevice cameraDevice) {
             for (CameraDevice.StateCallback callback : mCallbacks) {
                 callback.onClosed(cameraDevice);
             }
         }
 
         @Override
-        public void onDisconnected(CameraDevice cameraDevice) {
+        public void onDisconnected(@NonNull CameraDevice cameraDevice) {
             for (CameraDevice.StateCallback callback : mCallbacks) {
                 callback.onDisconnected(cameraDevice);
             }
         }
 
         @Override
-        public void onError(CameraDevice cameraDevice, int error) {
+        public void onError(@NonNull CameraDevice cameraDevice, int error) {
             for (CameraDevice.StateCallback callback : mCallbacks) {
                 callback.onError(cameraDevice, error);
             }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 1302d0f..8d30323 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -566,6 +566,7 @@
                         mExecutor);
     }
 
+    @NonNull
     @Override
     public String toString() {
         return TAG + ":" + getName();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
index b7f7f45..dc4dfd6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
@@ -38,6 +38,7 @@
 import androidx.camera.core.ImageOutputConfig.RotationValue;
 
 import com.google.auto.value.AutoValue;
+import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.Map;
 import java.util.Objects;
@@ -301,6 +302,7 @@
         }
     }
 
+    @NonNull
     @Override
     public String toString() {
         return TAG + ":" + getName();
@@ -464,13 +466,40 @@
         UNKNOWN_ERROR
     }
 
-    /** A listener of {@link PreviewOutput}. */
+    /**
+     * A listener of {@link PreviewOutput}.
+     *
+     * TODO(b/117519540): Mark as deprecated once PreviewSurfaceCallback is ready.
+     */
     public interface OnPreviewOutputUpdateListener {
         /** Callback when PreviewOutput has been updated. */
         void onUpdated(PreviewOutput output);
     }
 
     /**
+     * A callback to access the Preview Surface.
+     */
+    public interface PreviewSurfaceCallback {
+
+        /**
+         * Get preview output Surface with the given resolution and format.
+         *
+         * <p> This is called when Preview needs a valid Surface. e.g. when the Preview is bound
+         * to lifecycle or the current Surface is no longer valid. When that happens, the
+         * implementation is required to create a Surface with the given resolution/format.
+         *
+         * <p> The Surface should be released after the use case is no longer active. If released
+         * prematurely, the implementation will be asked to provide a new Surface via this method.
+         *
+         * @param resolution the resolution required by CameraX.
+         * @param imageFormat the {@link ImageFormat} required by CameraX.
+         * @return A ListenableFuture that contains the user created Surface.
+         */
+        @NonNull
+        ListenableFuture<Surface> getSurface(@NonNull Size resolution, int imageFormat);
+    }
+
+    /**
      * Provides a base static default configuration for the Preview
      *
      * <p>These values may be overridden by the implementation. They only provide a minimum set of
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
index e70e683..ce606be 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/Version.java
@@ -18,6 +18,8 @@
 
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
+
 import com.google.auto.value.AutoValue;
 
 import java.math.BigInteger;
@@ -76,6 +78,7 @@
 
     abstract String getDescription();
 
+    @NonNull
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder(getMajor() + "." + getMinor() + "." + getPatch());
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index 87b88cc..718544f 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -30,7 +30,7 @@
     implementation("androidx.annotation:annotation:1.0.0")
     implementation(GUAVA_LISTENABLE_FUTURE)
     implementation(project(":camera:camera-core"))
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
     implementation(JUNIT)
 
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 553a0d8..5310c58 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -837,7 +837,7 @@
 
     @Override
     public void onRequestPermissionsResult(
-            int requestCode, String[] permissions, int[] grantResults) {
+            int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         switch (requestCode) {
             case PERMISSIONS_REQUEST_CODE: {
                 // If request is cancelled, the result arrays are empty.
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index e767b76..8a5ec06 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -514,7 +514,7 @@
 
     @Override
     public void onRequestPermissionsResult(
-            int requestCode, String[] permissions, int[] grantResults) {
+            int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         switch (requestCode) {
             case PERMISSIONS_REQUEST_CODE: {
                 // If request is cancelled, the result arrays are empty.
diff --git a/car/moderator/build.gradle b/car/moderator/build.gradle
index 4d19dbd..bd7370d 100644
--- a/car/moderator/build.gradle
+++ b/car/moderator/build.gradle
@@ -26,7 +26,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/content/build.gradle b/content/build.gradle
index cafb452..4a27186 100644
--- a/content/build.gradle
+++ b/content/build.gradle
@@ -26,7 +26,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(JUNIT)
diff --git a/coordinatorlayout/build.gradle b/coordinatorlayout/build.gradle
index ae2a733..67dfc84 100644
--- a/coordinatorlayout/build.gradle
+++ b/coordinatorlayout/build.gradle
@@ -10,8 +10,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    // TODO: change to 1.1.0-alpha04 after release
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.customview:customview:1.0.0")
 
diff --git a/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
index 5cf76a1..4fdc5d5 100644
--- a/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
+++ b/coordinatorlayout/src/androidTest/res/layout/design_snackbar_behavior_layout_attr.xml
@@ -22,7 +22,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <androidx.appcompat.widget.AppCompatTextView
+    <TextView
         android:id="@+id/text"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
@@ -31,7 +31,7 @@
         android:textSize="18dip"
         android:textStyle="bold"
         android:padding="12dip"
-        app:textAllCaps="true"
+        android:textAllCaps="true"
         app:layout_behavior="androidx.coordinatorlayout.custom.TestFloatingBehavior" />
 
 </androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/core/core/api/1.2.0-alpha04.txt b/core/core/api/1.2.0-alpha04.txt
index d39053e..fb12c76 100644
--- a/core/core/api/1.2.0-alpha04.txt
+++ b/core/core/api/1.2.0-alpha04.txt
@@ -916,6 +916,7 @@
     method public android.content.Intent getIntent();
     method public android.content.Intent![] getIntents();
     method public CharSequence? getLongLabel();
+    method public int getRank();
     method public CharSequence getShortLabel();
     method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
   }
@@ -931,9 +932,11 @@
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
-    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
   }
 
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index d39053e..fb12c76 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -916,6 +916,7 @@
     method public android.content.Intent getIntent();
     method public android.content.Intent![] getIntents();
     method public CharSequence? getLongLabel();
+    method public int getRank();
     method public CharSequence getShortLabel();
     method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
   }
@@ -931,9 +932,11 @@
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
-    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
   }
 
diff --git a/core/core/api/restricted_1.2.0-alpha04.txt b/core/core/api/restricted_1.2.0-alpha04.txt
index 7991be2..50fe0b6 100644
--- a/core/core/api/restricted_1.2.0-alpha04.txt
+++ b/core/core/api/restricted_1.2.0-alpha04.txt
@@ -1017,6 +1017,7 @@
     method public android.content.Intent getIntent();
     method public android.content.Intent![] getIntents();
     method public CharSequence? getLongLabel();
+    method public int getRank();
     method public CharSequence getShortLabel();
     method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
   }
@@ -1034,9 +1035,11 @@
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
-    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
   }
 
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 7991be2..50fe0b6 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -1017,6 +1017,7 @@
     method public android.content.Intent getIntent();
     method public android.content.Intent![] getIntents();
     method public CharSequence? getLongLabel();
+    method public int getRank();
     method public CharSequence getShortLabel();
     method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
   }
@@ -1034,9 +1035,11 @@
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
-    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
+    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
     method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
   }
 
diff --git a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
index 516759c..6d00a7c 100644
--- a/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/content/pm/ShortcutInfoCompatTest.java
@@ -126,6 +126,7 @@
         assertEquals(TEST_SHORTCUT_ID, compat.getId());
         assertEquals(TEST_SHORTCUT_SHORT_LABEL, compat.getShortLabel());
         assertEquals(mAction, compat.getIntent());
+        assertEquals(0, compat.getRank());
         assertNull(compat.getLongLabel());
         assertNull(compat.getDisabledMessage());
         assertNull(compat.getActivity());
@@ -140,11 +141,13 @@
         Set<String> categories = new HashSet<>();
         categories.add("cat1");
         categories.add("cat2");
+        int rank = 3;
         ShortcutInfoCompat compat = mBuilder
                 .setActivity(activity)
                 .setCategories(categories)
                 .setDisabledMessage(disabledMessage)
                 .setLongLabel(longLabel)
+                .setRank(rank)
                 .build();
 
         ShortcutInfoCompat copyCompat = new ShortcutInfoCompat.Builder(compat).build();
@@ -155,6 +158,7 @@
         assertEquals(disabledMessage, copyCompat.getDisabledMessage());
         assertEquals(activity, copyCompat.getActivity());
         assertEquals(categories, copyCompat.getCategories());
+        assertEquals(rank, copyCompat.getRank());
     }
 
     @Test
@@ -166,7 +170,7 @@
         Set<String> categories = new HashSet<>();
         categories.add("cat1");
         categories.add("cat2");
-
+        int rank = 3;
         ShortcutInfo.Builder builder = new ShortcutInfo.Builder(mContext, TEST_SHORTCUT_ID);
         ShortcutInfo shortcut = builder.setIntent(mAction)
                 .setShortLabel(TEST_SHORTCUT_SHORT_LABEL)
@@ -174,6 +178,7 @@
                 .setCategories(categories)
                 .setDisabledMessage(disabledMessage)
                 .setLongLabel(longLabel)
+                .setRank(rank)
                 .build();
 
         ShortcutInfoCompat compat = new ShortcutInfoCompat.Builder(mContext, shortcut).build();
@@ -185,6 +190,7 @@
         assertEquals(disabledMessage, compat.getDisabledMessage());
         assertEquals(activity, compat.getActivity());
         assertEquals(categories, compat.getCategories());
+        assertEquals(rank, compat.getRank());
     }
 
     @Test
@@ -195,12 +201,13 @@
         Set<String> categories = new HashSet<>();
         categories.add("cat1");
         categories.add("cat2");
-
+        int rank = 3;
         ShortcutInfoCompat compat = mBuilder
                 .setActivity(activity)
                 .setCategories(categories)
                 .setDisabledMessage(disabledMessage)
                 .setLongLabel(longLabel)
+                .setRank(3)
                 .build();
         assertEquals(TEST_SHORTCUT_ID, compat.getId());
         assertEquals(TEST_SHORTCUT_SHORT_LABEL, compat.getShortLabel());
@@ -209,6 +216,7 @@
         assertEquals(disabledMessage, compat.getDisabledMessage());
         assertEquals(activity, compat.getActivity());
         assertEquals(categories, compat.getCategories());
+        assertEquals(rank, compat.getRank());
     }
 
     @Test
@@ -220,12 +228,13 @@
         Set<String> categories = new HashSet<>();
         categories.add("cat1");
         categories.add("cat2");
-
+        int rank = 3;
         ShortcutInfoCompat compat = mBuilder
                 .setActivity(activity)
                 .setCategories(categories)
                 .setDisabledMessage(disabledMessage)
                 .setLongLabel(longLabel)
+                .setRank(3)
                 .build();
 
         ShortcutInfo shortcut = compat.toShortcutInfo();
@@ -238,6 +247,7 @@
         assertEquals(disabledMessage, shortcut.getDisabledMessage());
         assertEquals(activity, shortcut.getActivity());
         assertEquals(categories, shortcut.getCategories());
+        assertEquals(rank, shortcut.getRank());
     }
 
     @Test
@@ -249,7 +259,7 @@
 
         ShortcutInfoCompat compat = mBuilder
                 .setPersons(persons)
-                .setLongLived()
+                .setLongLived(true)
                 .build();
 
         ShortcutInfo shortcut = compat.toShortcutInfo();
diff --git a/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java b/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
index e5f4ef9..a8a8963 100644
--- a/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java
@@ -67,6 +67,8 @@
     // TODO: Support |auto| when the value of mIsLongLived is not set
     boolean mIsLongLived;
 
+    int mRank;
+
     ShortcutInfoCompat() { }
 
     /**
@@ -92,6 +94,7 @@
         if (mCategories != null) {
             builder.setCategories(mCategories);
         }
+        builder.setRank(mRank);
 
         if (Build.VERSION.SDK_INT >= 29) {
             if (mPersons != null && mPersons.length > 0) {
@@ -241,6 +244,15 @@
     }
 
     /**
+     * Returns the rank of the shortcut set with {@link Builder#setRank(int)}.
+     *
+     * @see Builder#setRank(int)
+     */
+    public int getRank() {
+        return mRank;
+    }
+
+    /**
      * @hide
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -311,6 +323,7 @@
             mInfo.mIcon = shortcutInfo.mIcon;
             mInfo.mIsAlwaysBadged = shortcutInfo.mIsAlwaysBadged;
             mInfo.mIsLongLived = shortcutInfo.mIsLongLived;
+            mInfo.mRank = shortcutInfo.mRank;
             if (shortcutInfo.mPersons != null) {
                 mInfo.mPersons = Arrays.copyOf(shortcutInfo.mPersons, shortcutInfo.mPersons.length);
             }
@@ -336,6 +349,7 @@
             mInfo.mDisabledMessage = shortcutInfo.getDisabledMessage();
             mInfo.mCategories = shortcutInfo.getCategories();
             mInfo.mPersons = ShortcutInfoCompat.getPersonsFromExtra(shortcutInfo.getExtras());
+            mInfo.mRank = shortcutInfo.getRank();
         }
 
         /**
@@ -480,13 +494,35 @@
         }
 
         /**
+         * @deprecated Use {@ink #setLongLived(boolean)) instead.
+         */
+        @Deprecated
+        @NonNull
+        public Builder setLongLived() {
+            mInfo.mIsLongLived = true;
+            return this;
+        }
+
+        /**
          * Sets if a shortcut would be valid even if it has been unpublished/invisible by the app
          * (as a dynamic or pinned shortcut). If it is long lived, it can be cached by various
          * system services even after it has been unpublished as a dynamic shortcut.
          */
         @NonNull
-        public Builder setLongLived() {
-            mInfo.mIsLongLived = true;
+        public Builder setLongLived(boolean longLived) {
+            mInfo.mIsLongLived = longLived;
+            return this;
+        }
+
+        /**
+         * Sets rank of a shortcut, which is a non-negative value that's used by the system to sort
+         * shortcuts. Lower value means higher importance.
+         *
+         * @see ShortcutInfo#getRank() for details.
+         */
+        @NonNull
+        public Builder setRank(int rank) {
+            mInfo.mRank = rank;
             return this;
         }
 
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index fe7bd58..6ad3e31 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -9,7 +9,7 @@
 }
 
 dependencies {
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 0b811cb..4e13514 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -22,7 +22,7 @@
     // treats this as local jar and package it inside the aar.
     api files(configurations.repackage)
 
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation(project(':collection:collection'))
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/fragment/fragment-ktx/build.gradle b/fragment/fragment-ktx/build.gradle
index 45b7557..7a021ff 100644
--- a/fragment/fragment-ktx/build.gradle
+++ b/fragment/fragment-ktx/build.gradle
@@ -38,7 +38,7 @@
     api(project(":activity:activity-ktx")) {
         because 'Mirror fragment dependency graph for -ktx artifacts'
     }
-    api("androidx.core:core-ktx:1.1.0-rc01") {
+    api("androidx.core:core-ktx:1.1.0") {
         because 'Mirror fragment dependency graph for -ktx artifacts'
     }
     api("androidx.collection:collection-ktx:1.1.0") {
diff --git a/fragment/fragment/build.gradle b/fragment/fragment/build.gradle
index 669429a..777cb59 100644
--- a/fragment/fragment/build.gradle
+++ b/fragment/fragment/build.gradle
@@ -18,7 +18,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     api("androidx.collection:collection:1.1.0")
     api("androidx.viewpager:viewpager:1.0.0")
     api("androidx.loader:loader:1.0.0")
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index a3e453a..f5e1ba4 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/gridlayout/build.gradle b/gridlayout/build.gradle
index efb7375..58ab795 100644
--- a/gridlayout/build.gradle
+++ b/gridlayout/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api(ANDROIDX_ANNOTATION)
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/inspection/inspection/src/main/java/androidx/inspection/Connection.java b/inspection/inspection/src/main/java/androidx/inspection/Connection.java
new file mode 100644
index 0000000..fd0c3f2
--- /dev/null
+++ b/inspection/inspection/src/main/java/androidx/inspection/Connection.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.inspection;
+
+import androidx.annotation.NonNull;
+
+/**
+ * A class representing a connection between studio and inspectors.
+ */
+public abstract class Connection {
+
+    /**
+     * Sends raw bytes to studio.
+     *
+     * @param data An array of bytes. Up to inspectors to determine how to encode bytes.
+     */
+    public void sendEvent(@NonNull byte[] data) {
+    }
+}
diff --git a/inspection/inspection/src/main/java/androidx/inspection/Inspector.java b/inspection/inspection/src/main/java/androidx/inspection/Inspector.java
index c7686ad7..d5b68fc 100644
--- a/inspection/inspection/src/main/java/androidx/inspection/Inspector.java
+++ b/inspection/inspection/src/main/java/androidx/inspection/Inspector.java
@@ -16,16 +16,29 @@
 
 package androidx.inspection;
 
+import androidx.annotation.NonNull;
+
 /**
- *  Implementation of this class are responsible to handle command from frontend and
- *  send back events.
+ * Implementation of this class are responsible to handle command from frontend and
+ * send back events.
  */
 public abstract class Inspector {
+
+    public Inspector(@NonNull Connection connection) {
+    }
+
     /**
-     * Called when this inspector was disposed and no longer needed.
-     * <p>
+     * Called when this inspector  is no longer needed.
+     *
      * Agent should use this callback to unsubscribe from any events that it is listening to.
      */
     public void onDispose() {
     }
+
+    /**
+     * An inspector can implement this to handle incoming commands.
+     *
+     * @param data a raw byte array of the command sent by studio.
+     */
+    public abstract void onReceiveCommand(@NonNull byte[] data);
 }
diff --git a/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java b/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java
index f0e3568..082f223 100644
--- a/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java
+++ b/inspection/inspection/src/main/java/androidx/inspection/InspectorFactory.java
@@ -47,10 +47,12 @@
         return mInspectorId;
     }
 
-    // TODO: pass the connection in this method
     /**
+     * Creates a new inspector with the provided connection.
+     *
+     * @param connection a connection to send events.
      * @return a new instance of an inspector.
      */
     @NonNull
-    public abstract T createInspector();
+    public abstract T createInspector(@NonNull Connection connection);
 }
diff --git a/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt b/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt
index a19ad5b..b519102 100644
--- a/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt
+++ b/inspection/inspection/src/test/java/androidx/inspection/InspectorTest.kt
@@ -26,7 +26,11 @@
 
     @Test
     fun dummyTest() {
-        val value = object : Inspector() {}
+        val connection = object : Connection() {}
+        val value = object : Inspector(connection) {
+            override fun onReceiveCommand(data: ByteArray) {
+            }
+        }
         assertThat(value).isNotNull()
     }
 }
\ No newline at end of file
diff --git a/leanback/build.gradle b/leanback/build.gradle
index 7588656..df32fcf 100644
--- a/leanback/build.gradle
+++ b/leanback/build.gradle
@@ -11,7 +11,7 @@
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
     api("androidx.interpolator:interpolator:1.0.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.media:media:1.0.0")
     api("androidx.fragment:fragment:1.0.0")
diff --git a/legacy/core-utils/build.gradle b/legacy/core-utils/build.gradle
index 7a331a9..c4fed24 100644
--- a/legacy/core-utils/build.gradle
+++ b/legacy/core-utils/build.gradle
@@ -9,7 +9,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     api(project(":documentfile"))
     api(project(":loader:loader"))
     api(project(":localbroadcastmanager"))
diff --git a/media/build.gradle b/media/build.gradle
index 913a501..facba79 100644
--- a/media/build.gradle
+++ b/media/build.gradle
@@ -9,7 +9,7 @@
 }
 
 dependencies {
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/media2/integration-tests/testapp/build.gradle b/media2/integration-tests/testapp/build.gradle
index b269e6a..ffefd37 100644
--- a/media2/integration-tests/testapp/build.gradle
+++ b/media2/integration-tests/testapp/build.gradle
@@ -30,7 +30,7 @@
     implementation(project(":media2:media2-player"))
     implementation(project(":media2:media2-widget"))
     implementation("androidx.appcompat:appcompat:1.0.2")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
 }
 
 android {
diff --git a/media2/session/api/1.1.0-alpha01.ignore b/media2/session/api/1.1.0-alpha01.ignore
new file mode 100644
index 0000000..a5f5b4a
--- /dev/null
+++ b/media2/session/api/1.1.0-alpha01.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedInterface: androidx.media2.session.SessionResult:
+    Class androidx.media2.session.SessionResult no longer implements androidx.versionedparcelable.VersionedParcelable
diff --git a/media2/session/api/1.1.0-alpha01.txt b/media2/session/api/1.1.0-alpha01.txt
index d16e2fb..83a9ba0 100644
--- a/media2/session/api/1.1.0-alpha01.txt
+++ b/media2/session/api/1.1.0-alpha01.txt
@@ -353,7 +353,7 @@
     method public androidx.media2.session.SessionCommandGroup.Builder removeCommand(androidx.media2.session.SessionCommand);
   }
 
-  public class SessionResult implements androidx.media2.common.BaseResult androidx.versionedparcelable.VersionedParcelable {
+  public class SessionResult extends androidx.versionedparcelable.CustomVersionedParcelable implements androidx.media2.common.BaseResult {
     ctor public SessionResult(int, android.os.Bundle?);
     method public long getCompletionTime();
     method public android.os.Bundle? getCustomCommandResult();
diff --git a/media2/session/api/current.txt b/media2/session/api/current.txt
index d16e2fb..83a9ba0 100644
--- a/media2/session/api/current.txt
+++ b/media2/session/api/current.txt
@@ -353,7 +353,7 @@
     method public androidx.media2.session.SessionCommandGroup.Builder removeCommand(androidx.media2.session.SessionCommand);
   }
 
-  public class SessionResult implements androidx.media2.common.BaseResult androidx.versionedparcelable.VersionedParcelable {
+  public class SessionResult extends androidx.versionedparcelable.CustomVersionedParcelable implements androidx.media2.common.BaseResult {
     ctor public SessionResult(int, android.os.Bundle?);
     method public long getCompletionTime();
     method public android.os.Bundle? getCustomCommandResult();
diff --git a/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java b/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java
index 2982d35..e22bbe6 100644
--- a/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/ConnectionResult.java
@@ -54,8 +54,10 @@
     PendingIntent mSessionActivity;
     @ParcelField(3)
     int mPlayerState;
-    @ParcelField(4)
+    @NonParcelField
     MediaItem mCurrentMediaItem;
+    @ParcelField(4)
+    MediaItem mParcelableCurrentMediaItem;
     @ParcelField(5)
     long mPositionEventTimeMs;
     @ParcelField(6)
@@ -235,11 +237,14 @@
     @Override
     public void onPreParceling(boolean isStream) {
         mSessionBinder = (IBinder) mSessionStub;
+        mParcelableCurrentMediaItem = MediaUtils.upcastForPreparceling(mCurrentMediaItem);
     }
 
     @Override
     public void onPostParceling() {
         mSessionStub = IMediaSession.Stub.asInterface(mSessionBinder);
         mSessionBinder = null;
+        mCurrentMediaItem = mParcelableCurrentMediaItem;
+        mParcelableCurrentMediaItem = null;
     }
 }
diff --git a/media2/session/src/main/java/androidx/media2/session/LibraryResult.java b/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
index c1dd2d4..def0bc2 100644
--- a/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/LibraryResult.java
@@ -72,8 +72,10 @@
     int mResultCode;
     @ParcelField(2)
     long mCompletionTime;
-    @ParcelField(3)
+    @NonParcelField
     MediaItem mItem;
+    @ParcelField(3)
+    MediaItem mParcelableItem;
     @ParcelField(4)
     MediaLibraryService.LibraryParams mParams;
     // Mark list of media items NonParcelField to send the list through the ParcelImpListSlice.
@@ -221,6 +223,7 @@
     @RestrictTo(LIBRARY)
     @Override
     public void onPreParceling(boolean isStream) {
+        mParcelableItem = MediaUtils.upcastForPreparceling(mItem);
         mItemListSlice = MediaUtils.convertMediaItemListToParcelImplListSlice(mItemList);
     }
 
@@ -230,6 +233,8 @@
     @RestrictTo(LIBRARY)
     @Override
     public void onPostParceling() {
+        mItem = mParcelableItem;
+        mParcelableItem = null;
         mItemList = MediaUtils.convertParcelImplListSliceToMediaItemList(mItemListSlice);
         mItemListSlice = null;
     }
diff --git a/media2/session/src/main/java/androidx/media2/session/MediaUtils.java b/media2/session/src/main/java/androidx/media2/session/MediaUtils.java
index 1b2b775..f9148f3 100644
--- a/media2/session/src/main/java/androidx/media2/session/MediaUtils.java
+++ b/media2/session/src/main/java/androidx/media2/session/MediaUtils.java
@@ -130,6 +130,24 @@
     }
 
     /**
+     * Upcasts a {@link MediaItem} to the {@link MediaItem} type for pre-parceling. Note that
+     * {@link MediaItem}'s subclass object cannot be parceled due to the security issue.
+     *
+     * @param item an item
+     * @return
+     */
+    // TODO(b/139255697): Provide the functionality in the media2-common.
+    public static MediaItem upcastForPreparceling(MediaItem item) {
+        if (item == null || item.getClass() == MediaItem.class) {
+            return item;
+        }
+        return new MediaItem.Builder()
+                .setStartPosition(item.getStartPosition())
+                .setEndPosition(item.getEndPosition())
+                .setMetadata(item.getMetadata()).build();
+    }
+
+    /**
      * Creates a {@link MediaBrowserCompat.MediaItem} from the {@link MediaItem}.
      *
      * @param item2 an item.
@@ -805,7 +823,7 @@
      */
     @NonNull
     public static SessionCommandGroup convertToSessionCommandGroup(long sessionFlags,
-            PlaybackStateCompat state) {
+            @Nullable PlaybackStateCompat state) {
         SessionCommandGroup.Builder commandsBuilder = new SessionCommandGroup.Builder();
         commandsBuilder.addAllPlayerBasicCommands(COMMAND_VERSION_CURRENT);
         boolean includePlaylistCommands = (sessionFlags & FLAG_HANDLES_QUEUE_COMMANDS) != 0;
@@ -836,7 +854,7 @@
      * @return custom layout. Always non-null.
      */
     @NonNull
-    public static List<CommandButton> convertToCustomLayout(PlaybackStateCompat state) {
+    public static List<CommandButton> convertToCustomLayout(@Nullable PlaybackStateCompat state) {
         List<CommandButton> layout = new ArrayList<>();
         if (state == null) {
             return layout;
diff --git a/media2/session/src/main/java/androidx/media2/session/SessionResult.java b/media2/session/src/main/java/androidx/media2/session/SessionResult.java
index e9a8301..998b4c0 100644
--- a/media2/session/src/main/java/androidx/media2/session/SessionResult.java
+++ b/media2/session/src/main/java/androidx/media2/session/SessionResult.java
@@ -16,6 +16,7 @@
 
 package androidx.media2.session;
 
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
 import android.os.Bundle;
@@ -29,8 +30,9 @@
 import androidx.concurrent.futures.ResolvableFuture;
 import androidx.media2.common.MediaItem;
 import androidx.media2.common.SessionPlayer;
+import androidx.versionedparcelable.CustomVersionedParcelable;
+import androidx.versionedparcelable.NonParcelField;
 import androidx.versionedparcelable.ParcelField;
-import androidx.versionedparcelable.VersionedParcelable;
 import androidx.versionedparcelable.VersionedParcelize;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -43,7 +45,7 @@
  * {@link MediaSession} and {@link MediaController}.
  */
 @VersionedParcelize
-public class SessionResult implements RemoteResult, VersionedParcelable {
+public class SessionResult extends CustomVersionedParcelable implements RemoteResult {
     /**
      * Result code representing that the command is successfully completed.
      * <p>
@@ -84,8 +86,10 @@
     long mCompletionTime;
     @ParcelField(3)
     Bundle mCustomCommandResult;
-    @ParcelField(4)
+    @NonParcelField
     MediaItem mItem;
+    @ParcelField(4)
+    MediaItem mParcelableItem;
 
     /**
      * Constructor to be used by {@link MediaSession.SessionCallback#onCustomCommand(
@@ -208,4 +212,23 @@
     public MediaItem getMediaItem() {
         return mItem;
     }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    @Override
+    public void onPreParceling(boolean isStream) {
+        mParcelableItem = MediaUtils.upcastForPreparceling(mItem);
+    }
+
+    /**
+     * @hide
+     */
+    @RestrictTo(LIBRARY)
+    @Override
+    public void onPostParceling() {
+        mItem = mParcelableItem;
+        mParcelableItem = null;
+    }
 }
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java
index accb8aa..69e1734 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaSessionProviderService.java
@@ -226,12 +226,10 @@
 
                 ParcelImplListSlice listSlice = config.getParcelable(KEY_PLAYLIST);
                 if (listSlice != null) {
-                    localPlayer.mPlaylist = MediaTestUtils.convertToMediaItems(listSlice.getList(),
-                            false /* createItem */);
+                    localPlayer.mPlaylist = MediaTestUtils.convertToMediaItems(listSlice.getList());
                 }
-                ParcelImpl currentItem = config.getParcelable(KEY_MEDIA_ITEM);
-                localPlayer.mCurrentMediaItem = (currentItem == null)
-                        ? null : (MediaItem) MediaParcelUtils.fromParcelable(currentItem);
+                localPlayer.mCurrentMediaItem =
+                        MediaTestUtils.convertToMediaItem(config.getParcelable(KEY_MEDIA_ITEM));
                 localPlayer.mMetadata = ParcelUtils.getVersionedParcelable(config, KEY_METADATA);
                 ParcelImpl videoSize = config.getParcelable(KEY_VIDEO_SIZE);
                 if (videoSize != null) {
@@ -439,7 +437,7 @@
                 throws RemoteException {
             MediaSession session = mSessionMap.get(sessionId);
             MockPlayer player = (MockPlayer) session.getPlayer();
-            player.mPlaylist = MediaTestUtils.convertToMediaItems(playlist, false /* createItem */);
+            player.mPlaylist = MediaTestUtils.convertToMediaItems(playlist);
         }
 
         @Override
diff --git a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java
index e1a375d..7e3fa85 100644
--- a/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java
+++ b/media2/session/version-compat-tests/current/service/src/androidTest/java/androidx/media2/test/service/MediaTestUtils.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
 import android.util.Log;
@@ -30,6 +31,7 @@
 import androidx.media2.common.MediaItem;
 import androidx.media2.common.MediaMetadata;
 import androidx.media2.common.MediaParcelUtils;
+import androidx.media2.common.UriMediaItem;
 import androidx.media2.session.MediaLibraryService.LibraryParams;
 import androidx.media2.session.MediaSession;
 import androidx.media2.session.MediaSession.ControllerInfo;
@@ -133,28 +135,54 @@
                 .build();
     }
 
-    public static List<MediaItem> convertToMediaItems(List<ParcelImpl> list,
-            boolean createItem) {
+    /**
+     * Converts the List of {@link ParcelImpl} to the list of {@link MediaItem} with the
+     * {@link #convertToMediaItem(ParcelImpl)}.
+     * <p>
+     * Use this API in the {@link MediaSessionProviderService} to handle incoming initialization
+     * requests from the RemoteMediaSession. It would help to test {@link MediaItem}'s subclass
+     * instance across the process.
+     *
+     * @param list
+     * @return
+     */
+    public static List<MediaItem> convertToMediaItems(List<ParcelImpl> list) {
         if (list == null) {
             return null;
         }
 
         List<MediaItem> result = new ArrayList<>();
-        if (createItem) {
-            for (ParcelImpl parcel : list) {
-                MediaItem item = MediaParcelUtils.fromParcelable(parcel);
-                result.add(new FileMediaItem.Builder(ParcelFileDescriptor.adoptFd(-1))
-                        .setMetadata(item.getMetadata())
-                        .build());
-            }
-        } else {
-            for (ParcelImpl parcel : list) {
-                result.add((MediaItem) MediaParcelUtils.fromParcelable(parcel));
-            }
+        for (ParcelImpl parcel : list) {
+            result.add(convertToMediaItem(parcel));
         }
         return result;
     }
 
+    /**
+     * Converts the {@link ParcelImpl} to {@link MediaItem}, by creating {@link UriMediaItem}.
+     * <p>
+     * Use this API in the {@link MediaSessionProviderService} to handle incoming initialization
+     * requests from the RemoteMediaSession. It would help to test {@link MediaItem}'s subclass
+     * instance across the process.
+     *
+     * @param item
+     * @return
+     */
+    public static MediaItem convertToMediaItem(ParcelImpl item) {
+        if (item == null) {
+            return null;
+        }
+        MediaItem mediaItem = MediaParcelUtils.fromParcelable(item);
+        if (mediaItem == null) {
+            return null;
+        }
+        String mediaId = mediaItem.getMediaId();
+        return new UriMediaItem.Builder(Uri.parse("android://" + mediaId))
+                .setStartPosition(mediaItem.getStartPosition())
+                .setEndPosition(mediaItem.getEndPosition())
+                .setMetadata(mediaItem.getMetadata()).build();
+    }
+
     public static ControllerInfo getTestControllerInfo(MediaSession session) {
         if (session == null) {
             return null;
diff --git a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java
index 2c3e2bf..3df4b6d 100644
--- a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java
+++ b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaControlView_WithPlayerTest.java
@@ -23,6 +23,7 @@
 import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
 import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
 import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 import static androidx.test.espresso.matcher.ViewMatchers.withText;
@@ -301,29 +302,31 @@
 
         assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
         assertEquals(0, playerWrapper.getCurrentMediaItemIndex());
-        onView(allOf(withId(R.id.prev), not(isClickable())));
-        onView(allOf(withId(R.id.next), isClickable()));
+        onView(allOf(withId(R.id.prev), isCompletelyDisplayed()))
+                .check(matches(not(isEnabled())));
+        onView(allOf(withId(R.id.next), isCompletelyDisplayed())).check(matches(isEnabled()));
         callback.mItemLatch = new CountDownLatch(1);
         onView(allOf(withId(R.id.next), isCompletelyDisplayed())).perform(click());
 
         assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
         assertEquals(1, playerWrapper.getCurrentMediaItemIndex());
-        onView(allOf(withId(R.id.prev), isClickable()));
-        onView(allOf(withId(R.id.next), isClickable()));
+        onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).check(matches(isEnabled()));
+        onView(allOf(withId(R.id.next), isCompletelyDisplayed())).check(matches(isEnabled()));
         callback.mItemLatch = new CountDownLatch(1);
         onView(allOf(withId(R.id.next), isCompletelyDisplayed())).perform(click());
 
         assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
         assertEquals(2, playerWrapper.getCurrentMediaItemIndex());
-        onView(allOf(withId(R.id.prev), isClickable()));
-        onView(allOf(withId(R.id.next), not(isClickable())));
+        onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).check(matches(isEnabled()));
+        onView(allOf(withId(R.id.next), isCompletelyDisplayed()))
+                .check(matches(not(isEnabled())));
         callback.mItemLatch = new CountDownLatch(1);
         onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).perform(click());
 
         assertTrue(callback.mItemLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
         assertEquals(1, playerWrapper.getCurrentMediaItemIndex());
-        onView(allOf(withId(R.id.prev), isClickable()));
-        onView(allOf(withId(R.id.next), isClickable()));
+        onView(allOf(withId(R.id.prev), isCompletelyDisplayed())).check(matches(isEnabled()));
+        onView(allOf(withId(R.id.next), isCompletelyDisplayed())).check(matches(isEnabled()));
     }
 
     @Test
diff --git a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
index e005a01..19b36f11 100644
--- a/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
+++ b/media2/widget/src/androidTest/java/androidx/media2/widget/MediaWidgetTestBase.java
@@ -141,6 +141,8 @@
         return list;
     }
 
+    // TODO(b/138091975) Do not ignore returned Futures if feasible.
+    @SuppressWarnings("FutureReturnValueIgnored")
     PlayerWrapper createPlayerWrapperOfController(@NonNull PlayerWrapper.PlayerCallback callback,
             @Nullable MediaItem item, @Nullable List<MediaItem> playlist) {
         prepareLooper();
@@ -169,6 +171,8 @@
         return wrapper;
     }
 
+    // TODO(b/138091975) Do not ignore returned Futures if feasible.
+    @SuppressWarnings("FutureReturnValueIgnored")
     PlayerWrapper createPlayerWrapperOfPlayer(@NonNull PlayerWrapper.PlayerCallback callback,
             @Nullable MediaItem item, @Nullable List<MediaItem> playlist) {
         SessionPlayer player = new MediaPlayer(mContext);
diff --git a/media2/widget/src/androidTest/res/values/themes.xml b/media2/widget/src/androidTest/res/values/themes.xml
index 2843f5e..ff1c3ab 100644
--- a/media2/widget/src/androidTest/res/values/themes.xml
+++ b/media2/widget/src/androidTest/res/values/themes.xml
@@ -18,7 +18,7 @@
 <resources>
 
     <style name="HasWindowTitle">
-        <item name="windowNoTitle">false</item>
+        <item name="android:windowNoTitle">false</item>
     </style>
 
 </resources>
\ No newline at end of file
diff --git a/paging/common/api/3.0.0-alpha01.txt b/paging/common/api/3.0.0-alpha01.txt
index ffefbad..ac81ae2 100644
--- a/paging/common/api/3.0.0-alpha01.txt
+++ b/paging/common/api/3.0.0-alpha01.txt
@@ -135,9 +135,15 @@
     ctor public PageKeyedDataSourceKt();
   }
 
+  public enum PageLoadType {
+    enum_constant public static final androidx.paging.PageLoadType END;
+    enum_constant public static final androidx.paging.PageLoadType REFRESH;
+    enum_constant public static final androidx.paging.PageLoadType START;
+  }
+
   public abstract class PagedList<T> extends java.util.AbstractList<T> {
     method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
-    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public abstract void detach();
     method public T? get(int index);
     method public androidx.paging.PagedList.Config getConfig();
@@ -151,7 +157,7 @@
     method public boolean isImmutable();
     method public void loadAround(int index);
     method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
-    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void retry();
     method public java.util.List<T> snapshot();
     property public androidx.paging.PagedList.Config config;
@@ -238,12 +244,6 @@
     field public static final androidx.paging.PagedList.LoadState.Loading! INSTANCE;
   }
 
-  public enum PagedList.LoadType {
-    enum_constant public static final androidx.paging.PagedList.LoadType END;
-    enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
-    enum_constant public static final androidx.paging.PagedList.LoadType START;
-  }
-
   public final class PagedListConfigKt {
     ctor public PagedListConfigKt();
     method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -284,16 +284,16 @@
   }
 
   public static final class PagedSource.LoadParams<Key> {
-    ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
-    method public androidx.paging.PagedSource.LoadType component1();
+    ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PageLoadType component1();
     method public Key? component2();
     method public int component3();
     method public boolean component4();
     method public int component5();
-    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
     method public Key? getKey();
     method public int getLoadSize();
-    method public androidx.paging.PagedSource.LoadType getLoadType();
+    method public androidx.paging.PageLoadType getLoadType();
     method public int getPageSize();
     method public boolean getPlaceholdersEnabled();
   }
@@ -318,12 +318,6 @@
   public static final class PagedSource.LoadResult.Companion {
   }
 
-  public enum PagedSource.LoadType {
-    enum_constant public static final androidx.paging.PagedSource.LoadType END;
-    enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
-    enum_constant public static final androidx.paging.PagedSource.LoadType START;
-  }
-
   public final class PagedSourceKt {
     ctor public PagedSourceKt();
   }
diff --git a/paging/common/api/current.txt b/paging/common/api/current.txt
index ffefbad..ac81ae2 100644
--- a/paging/common/api/current.txt
+++ b/paging/common/api/current.txt
@@ -135,9 +135,15 @@
     ctor public PageKeyedDataSourceKt();
   }
 
+  public enum PageLoadType {
+    enum_constant public static final androidx.paging.PageLoadType END;
+    enum_constant public static final androidx.paging.PageLoadType REFRESH;
+    enum_constant public static final androidx.paging.PageLoadType START;
+  }
+
   public abstract class PagedList<T> extends java.util.AbstractList<T> {
     method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
-    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public abstract void detach();
     method public T? get(int index);
     method public androidx.paging.PagedList.Config getConfig();
@@ -151,7 +157,7 @@
     method public boolean isImmutable();
     method public void loadAround(int index);
     method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
-    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void retry();
     method public java.util.List<T> snapshot();
     property public androidx.paging.PagedList.Config config;
@@ -238,12 +244,6 @@
     field public static final androidx.paging.PagedList.LoadState.Loading! INSTANCE;
   }
 
-  public enum PagedList.LoadType {
-    enum_constant public static final androidx.paging.PagedList.LoadType END;
-    enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
-    enum_constant public static final androidx.paging.PagedList.LoadType START;
-  }
-
   public final class PagedListConfigKt {
     ctor public PagedListConfigKt();
     method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -284,16 +284,16 @@
   }
 
   public static final class PagedSource.LoadParams<Key> {
-    ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
-    method public androidx.paging.PagedSource.LoadType component1();
+    ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PageLoadType component1();
     method public Key? component2();
     method public int component3();
     method public boolean component4();
     method public int component5();
-    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
     method public Key? getKey();
     method public int getLoadSize();
-    method public androidx.paging.PagedSource.LoadType getLoadType();
+    method public androidx.paging.PageLoadType getLoadType();
     method public int getPageSize();
     method public boolean getPlaceholdersEnabled();
   }
@@ -318,12 +318,6 @@
   public static final class PagedSource.LoadResult.Companion {
   }
 
-  public enum PagedSource.LoadType {
-    enum_constant public static final androidx.paging.PagedSource.LoadType END;
-    enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
-    enum_constant public static final androidx.paging.PagedSource.LoadType START;
-  }
-
   public final class PagedSourceKt {
     ctor public PagedSourceKt();
   }
diff --git a/paging/common/api/restricted_3.0.0-alpha01.txt b/paging/common/api/restricted_3.0.0-alpha01.txt
index 939db30..259dc82 100644
--- a/paging/common/api/restricted_3.0.0-alpha01.txt
+++ b/paging/common/api/restricted_3.0.0-alpha01.txt
@@ -44,7 +44,6 @@
     method @AnyThread public void onInvalidated();
   }
 
-
   public static final class DataSource.Params<K> {
     method public int getInitialLoadSize();
     method public K? getKey();
@@ -139,10 +138,16 @@
     ctor public PageKeyedDataSourceKt();
   }
 
+  public enum PageLoadType {
+    enum_constant public static final androidx.paging.PageLoadType END;
+    enum_constant public static final androidx.paging.PageLoadType REFRESH;
+    enum_constant public static final androidx.paging.PageLoadType START;
+  }
+
   public abstract class PagedList<T> extends java.util.AbstractList<T> {
     ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public PagedList(kotlinx.coroutines.CoroutineScope coroutineScope, androidx.paging.PagedSource<?,T> pagedSource, androidx.paging.PagedStorage<T> storage, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher backgroundDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? boundaryCallback, androidx.paging.PagedList.Config config);
     method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
-    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final suspend <K, T> Object create(androidx.paging.PagedSource<K,T> p, kotlinx.coroutines.CoroutineScope pagedSource, kotlinx.coroutines.CoroutineDispatcher coroutineScope, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? initialFetchDispatcher, androidx.paging.PagedList.Config boundaryCallback, K? config, kotlin.coroutines.Continuation<? super androidx.paging.PagedList<T>> key);
     method public abstract void detach();
     method public T? get(int index);
@@ -158,9 +163,9 @@
     method public boolean isImmutable();
     method public void loadAround(int index);
     method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
-    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void retry();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PagedList.LoadType loadType, androidx.paging.PagedList.LoadState loadState);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PageLoadType loadType, androidx.paging.PagedList.LoadState loadState);
     method public java.util.List<T> snapshot();
     property public androidx.paging.PagedList.Config config;
     property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
@@ -251,26 +256,20 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract static class PagedList.LoadStateManager {
-    method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public final androidx.paging.PagedList.LoadState getEndState();
     method public final androidx.paging.PagedList.LoadState getRefreshState();
     method public final androidx.paging.PagedList.LoadState getStartState();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
     method public final void setEndState(androidx.paging.PagedList.LoadState p);
     method public final void setRefreshState(androidx.paging.PagedList.LoadState p);
     method public final void setStartState(androidx.paging.PagedList.LoadState p);
-    method public final void setState(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+    method public final void setState(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
     property public final androidx.paging.PagedList.LoadState endState;
     property public final androidx.paging.PagedList.LoadState refreshState;
     property public final androidx.paging.PagedList.LoadState startState;
   }
 
-  public enum PagedList.LoadType {
-    enum_constant public static final androidx.paging.PagedList.LoadType END;
-    enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
-    enum_constant public static final androidx.paging.PagedList.LoadType START;
-  }
-
   public final class PagedListConfigKt {
     ctor public PagedListConfigKt();
     method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -311,16 +310,16 @@
   }
 
   public static final class PagedSource.LoadParams<Key> {
-    ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
-    method public androidx.paging.PagedSource.LoadType component1();
+    ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PageLoadType component1();
     method public Key? component2();
     method public int component3();
     method public boolean component4();
     method public int component5();
-    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
     method public Key? getKey();
     method public int getLoadSize();
-    method public androidx.paging.PagedSource.LoadType getLoadType();
+    method public androidx.paging.PageLoadType getLoadType();
     method public int getPageSize();
     method public boolean getPlaceholdersEnabled();
   }
@@ -345,12 +344,6 @@
   public static final class PagedSource.LoadResult.Companion {
   }
 
-  public enum PagedSource.LoadType {
-    enum_constant public static final androidx.paging.PagedSource.LoadType END;
-    enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
-    enum_constant public static final androidx.paging.PagedSource.LoadType START;
-  }
-
   public final class PagedSourceKt {
     ctor public PagedSourceKt();
   }
diff --git a/paging/common/api/restricted_current.txt b/paging/common/api/restricted_current.txt
index 939db30..259dc82 100644
--- a/paging/common/api/restricted_current.txt
+++ b/paging/common/api/restricted_current.txt
@@ -44,7 +44,6 @@
     method @AnyThread public void onInvalidated();
   }
 
-
   public static final class DataSource.Params<K> {
     method public int getInitialLoadSize();
     method public K? getKey();
@@ -139,10 +138,16 @@
     ctor public PageKeyedDataSourceKt();
   }
 
+  public enum PageLoadType {
+    enum_constant public static final androidx.paging.PageLoadType END;
+    enum_constant public static final androidx.paging.PageLoadType REFRESH;
+    enum_constant public static final androidx.paging.PageLoadType START;
+  }
+
   public abstract class PagedList<T> extends java.util.AbstractList<T> {
     ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public PagedList(kotlinx.coroutines.CoroutineScope coroutineScope, androidx.paging.PagedSource<?,T> pagedSource, androidx.paging.PagedStorage<T> storage, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher backgroundDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? boundaryCallback, androidx.paging.PagedList.Config config);
     method public void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
-    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final suspend <K, T> Object create(androidx.paging.PagedSource<K,T> p, kotlinx.coroutines.CoroutineScope pagedSource, kotlinx.coroutines.CoroutineDispatcher coroutineScope, kotlinx.coroutines.CoroutineDispatcher notifyDispatcher, kotlinx.coroutines.CoroutineDispatcher fetchDispatcher, androidx.paging.PagedList.BoundaryCallback<T>? initialFetchDispatcher, androidx.paging.PagedList.Config boundaryCallback, K? config, kotlin.coroutines.Continuation<? super androidx.paging.PagedList<T>> key);
     method public abstract void detach();
     method public T? get(int index);
@@ -158,9 +163,9 @@
     method public boolean isImmutable();
     method public void loadAround(int index);
     method public void removeWeakCallback(androidx.paging.PagedList.Callback callback);
-    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void retry();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PagedList.LoadType loadType, androidx.paging.PagedList.LoadState loadState);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void setInitialLoadState(androidx.paging.PageLoadType loadType, androidx.paging.PagedList.LoadState loadState);
     method public java.util.List<T> snapshot();
     property public androidx.paging.PagedList.Config config;
     property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
@@ -251,26 +256,20 @@
   }
 
   @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract static class PagedList.LoadStateManager {
-    method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public final void dispatchCurrentLoadState(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public final androidx.paging.PagedList.LoadState getEndState();
     method public final androidx.paging.PagedList.LoadState getRefreshState();
     method public final androidx.paging.PagedList.LoadState getStartState();
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract void onStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
     method public final void setEndState(androidx.paging.PagedList.LoadState p);
     method public final void setRefreshState(androidx.paging.PagedList.LoadState p);
     method public final void setStartState(androidx.paging.PagedList.LoadState p);
-    method public final void setState(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
+    method public final void setState(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
     property public final androidx.paging.PagedList.LoadState endState;
     property public final androidx.paging.PagedList.LoadState refreshState;
     property public final androidx.paging.PagedList.LoadState startState;
   }
 
-  public enum PagedList.LoadType {
-    enum_constant public static final androidx.paging.PagedList.LoadType END;
-    enum_constant public static final androidx.paging.PagedList.LoadType REFRESH;
-    enum_constant public static final androidx.paging.PagedList.LoadType START;
-  }
-
   public final class PagedListConfigKt {
     ctor public PagedListConfigKt();
     method public static androidx.paging.PagedList.Config Config(int pageSize, int prefetchDistance = pageSize, boolean enablePlaceholders = true, int initialLoadSizeHint = pageSize * androidx.paging.PagedList.Config.Builder.DEFAULT_INITIAL_PAGE_MULTIPLIER, int maxSize = 2147483647);
@@ -311,16 +310,16 @@
   }
 
   public static final class PagedSource.LoadParams<Key> {
-    ctor public PagedSource.LoadParams(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
-    method public androidx.paging.PagedSource.LoadType component1();
+    ctor public PagedSource.LoadParams(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PageLoadType component1();
     method public Key? component2();
     method public int component3();
     method public boolean component4();
     method public int component5();
-    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PagedSource.LoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
+    method public androidx.paging.PagedSource.LoadParams<Key> copy(androidx.paging.PageLoadType loadType, Key? key, int loadSize, boolean placeholdersEnabled, int pageSize);
     method public Key? getKey();
     method public int getLoadSize();
-    method public androidx.paging.PagedSource.LoadType getLoadType();
+    method public androidx.paging.PageLoadType getLoadType();
     method public int getPageSize();
     method public boolean getPlaceholdersEnabled();
   }
@@ -345,12 +344,6 @@
   public static final class PagedSource.LoadResult.Companion {
   }
 
-  public enum PagedSource.LoadType {
-    enum_constant public static final androidx.paging.PagedSource.LoadType END;
-    enum_constant public static final androidx.paging.PagedSource.LoadType INITIAL;
-    enum_constant public static final androidx.paging.PagedSource.LoadType START;
-  }
-
   public final class PagedSourceKt {
     ctor public PagedSourceKt();
   }
diff --git a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
index 2fd1150..9ec9758 100644
--- a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
@@ -18,11 +18,11 @@
 
 import androidx.annotation.MainThread
 import androidx.annotation.RestrictTo
+import androidx.paging.PageLoadType.END
+import androidx.paging.PageLoadType.REFRESH
+import androidx.paging.PageLoadType.START
 import androidx.paging.PagedList.LoadState.Idle
 import androidx.paging.PagedList.LoadState.Loading
-import androidx.paging.PagedList.LoadType.END
-import androidx.paging.PagedList.LoadType.REFRESH
-import androidx.paging.PagedList.LoadType.START
 import androidx.paging.PagedSource.KeyProvider
 import androidx.paging.PagedSource.LoadResult.Companion.COUNT_UNDEFINED
 import kotlinx.coroutines.CoroutineDispatcher
@@ -104,7 +104,10 @@
     /**
      * Given a page result, apply or drop it, and return whether more loading is needed.
      */
-    override fun onPageResult(type: LoadType, pageResult: PagedSource.LoadResult<*, V>): Boolean {
+    override fun onPageResult(
+        type: PageLoadType,
+        pageResult: PagedSource.LoadResult<*, V>
+    ): Boolean {
         var continueLoading = false
         val page = pageResult.data
 
@@ -180,9 +183,10 @@
         return continueLoading
     }
 
-    override fun onStateChanged(type: LoadType, state: LoadState) = dispatchStateChange(type, state)
+    override fun onStateChanged(type: PageLoadType, state: LoadState) =
+        dispatchStateChange(type, state)
 
-    private fun triggerBoundaryCallback(type: LoadType, page: List<V>) {
+    private fun triggerBoundaryCallback(type: PageLoadType, page: List<V>) {
         if (boundaryCallback != null) {
             val deferEmpty = storage.size == 0
             val deferBegin = (!deferEmpty && type == START && page.isEmpty())
@@ -240,7 +244,7 @@
         pager.loadStateManager.dispatchCurrentLoadState(callback)
     }
 
-    override fun setInitialLoadState(loadType: LoadType, loadState: LoadState) {
+    override fun setInitialLoadState(loadType: PageLoadType, loadState: LoadState) {
         pager.loadStateManager.setState(loadType, loadState)
     }
 
diff --git a/paging/common/src/main/kotlin/androidx/paging/DataSource.kt b/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
index 5e0e59e..3a90a7e 100644
--- a/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/DataSource.kt
@@ -431,21 +431,11 @@
     }
 
     /**
-     * @hide
-     */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    enum class LoadType {
-        INITIAL,
-        START,
-        END
-    }
-
-    /**
      * @param K Type of the key used to query the [DataSource].
      * @property key Can be `null` for init, otherwise non-null
      */
     class Params<K : Any> internal constructor(
-        internal val type: LoadType,
+        internal val type: PageLoadType,
         val key: K?,
         val initialLoadSize: Int,
         val placeholdersEnabled: Boolean,
diff --git a/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt b/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt
index 7407055..a3628e8 100644
--- a/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/InitialPagedList.kt
@@ -23,7 +23,7 @@
 /**
  * InitialPagedList is an empty placeholder that's sent at the front of a stream of PagedLists.
  *
- * It's used solely for listening to [PagedList.LoadType.REFRESH] loading events, and retrying
+ * It's used solely for listening to [PageLoadType.REFRESH] loading events, and retrying
  * any errors that occur during initial load.
  *
  * @hide
diff --git a/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt b/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt
index 6066a0d..074c08a 100644
--- a/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/ItemKeyedDataSource.kt
@@ -181,15 +181,15 @@
     @Suppress("RedundantVisibilityModifier") // Metalava doesn't inherit visibility properly.
     internal final override suspend fun load(params: Params<Key>): BaseResult<Value> {
         return when (params.type) {
-            LoadType.INITIAL -> loadInitial(
+            PageLoadType.REFRESH -> loadInitial(
                 LoadInitialParams(
                     params.key,
                     params.initialLoadSize,
                     params.placeholdersEnabled
                 )
             )
-            LoadType.START -> loadBefore(LoadParams(params.key!!, params.pageSize))
-            LoadType.END -> loadAfter(LoadParams(params.key!!, params.pageSize))
+            PageLoadType.START -> loadBefore(LoadParams(params.key!!, params.pageSize))
+            PageLoadType.END -> loadAfter(LoadParams(params.key!!, params.pageSize))
         }
     }
 
diff --git a/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt b/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt
index 25d5f3e..a62d597 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PageKeyedDataSource.kt
@@ -211,15 +211,15 @@
      */
     @Suppress("RedundantVisibilityModifier") // Metalava doesn't inherit visibility properly.
     internal final override suspend fun load(params: Params<Key>): BaseResult<Value> = when {
-        params.type == LoadType.INITIAL -> loadInitial(
+        params.type == PageLoadType.REFRESH -> loadInitial(
             LoadInitialParams(
                 params.initialLoadSize,
                 params.placeholdersEnabled
             )
         )
         params.key == null -> BaseResult.empty()
-        params.type == LoadType.START -> loadBefore(LoadParams(params.key, params.pageSize))
-        params.type == LoadType.END -> loadAfter(LoadParams(params.key, params.pageSize))
+        params.type == PageLoadType.START -> loadBefore(LoadParams(params.key, params.pageSize))
+        params.type == PageLoadType.END -> loadAfter(LoadParams(params.key, params.pageSize))
         else -> throw IllegalArgumentException("Unsupported type " + params.type.toString())
     }
 
diff --git a/paging/common/src/main/kotlin/androidx/paging/PageLoadType.kt b/paging/common/src/main/kotlin/androidx/paging/PageLoadType.kt
new file mode 100644
index 0000000..bd6ed01
--- /dev/null
+++ b/paging/common/src/main/kotlin/androidx/paging/PageLoadType.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.paging
+
+/**
+ * Type of load a [PagedList] can trigger a [PagedSource] to perform.
+ *
+ * You can use a [LoadStateListener] to observe [PagedList.LoadState] of any [PageLoadType]. For UI
+ * purposes (swipe refresh, loading spinner, retry button), this is typically done by registering a
+ * [LoadStateListener] with the [androidx.paging.PagedListAdapter] or
+ * [androidx.paging.AsyncPagedListDiffer].
+ *
+ * @see PagedList.LoadState
+ */
+enum class PageLoadType {
+    /**
+     * [PagedList] content being refreshed, which can also be a result of [PagedSource]
+     * invalidation, refresh that may contain content updates, or the initial load.
+     */
+    REFRESH,
+
+    /**
+     * Load at the start of the [PagedList].
+     */
+    START,
+
+    /**
+     * Load at the end of the [PagedList].
+     */
+    END
+}
\ No newline at end of file
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
index 6ec7f37..9d429b1 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
@@ -26,7 +26,6 @@
 import androidx.paging.PagedList.Config.Builder
 import androidx.paging.PagedList.Config.Companion.MAX_SIZE_UNBOUNDED
 import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
 import androidx.paging.PagedSource.KeyProvider
 import androidx.paging.futures.DirectDispatcher
 import kotlinx.coroutines.CoroutineDispatcher
@@ -46,7 +45,7 @@
  * Callback for changes to loading state - whether the refresh, prepend, or append is idle, loading,
  * or has an error.
  *
- * Used to observe the [LoadState] of any [LoadType] (REFRESH/START/END). For UI purposes (swipe
+ * Used to observe the [LoadState] of any [PageLoadType] (REFRESH/START/END). For UI purposes (swipe
  * refresh, loading spinner, retry button), this is typically done by registering a
  * [LoadStateListener] with the [androidx.paging.PagedListAdapter] or
  * [androidx.paging.AsyncPagedListDiffer].
@@ -61,10 +60,10 @@
  * START/END events can be used to drive loading spinner items in your `RecyclerView`.
  *
  * @see [LoadState]
- * @see [LoadType]
+ * @see [PageLoadType]
  * @see [PagedList.retry]
  */
-typealias LoadStateListener = (type: LoadType, state: LoadState) -> Unit
+typealias LoadStateListener = (type: PageLoadType, state: LoadState) -> Unit
 
 /**
  * Lazy loading list that pages in immutable content from a [PagedSource].
@@ -190,7 +189,7 @@
             }
 
             val params = PagedSource.LoadParams(
-                PagedSource.LoadType.INITIAL,
+                PageLoadType.REFRESH,
                 key,
                 config.initialLoadSizeHint,
                 config.enablePlaceholders,
@@ -215,40 +214,13 @@
     }
 
     /**
-     * Type of load a PagedList can perform.
+     * LoadState of a PagedList load - associated with a [PageLoadType]
      *
-     * You can use a [LoadStateListener] to observe [LoadState] of any [LoadType]. For UI purposes
-     * (swipe refresh, loading spinner, retry button), this is typically done by registering a
-     * [LoadStateListener] with the [androidx.paging.PagedListAdapter] or
-     * [androidx.paging.AsyncPagedListDiffer].
-     *
-     * @see LoadState
-     */
-    enum class LoadType {
-        /**
-         * [PagedList] content being reloaded, may contain content updates.
-         */
-        REFRESH,
-
-        /**
-         * Load at the start of the [PagedList].
-         */
-        START,
-
-        /**
-         * Load at the end of the [PagedList].
-         */
-        END
-    }
-
-    /**
-     * LoadState of a PagedList load - associated with a [LoadType]
-     *
-     * You can use a [LoadStateListener] to observe [LoadState] of any [LoadType]. For UI
+     * You can use a [LoadStateListener] to observe [LoadState] of any [PageLoadType]. For UI
      * purposes (swipe refresh, loading spinner, retry button), this is typically done by
      * registering a callback with the `PagedListAdapter` or `AsyncPagedListDiffer`.
      *
-     * @see LoadType
+     * @see PageLoadType
      */
     sealed class LoadState {
         /**
@@ -506,7 +478,7 @@
          * Creates a [PagedList] asynchronously with the given parameters.
          *
          * This call will dispatch [PagedSource.load] immediately with
-         * [PagedSource.LoadType.INITIAL], and return a [PagedList] once it completes, triggering
+         * [PageLoadType.REFRESH], and return a [PagedList] once it completes, triggering
          * [loadStateListeners].
          *
          * @throws IllegalArgumentException if [notifyDispatcher] or [fetchDispatcher] are not set.
@@ -903,18 +875,18 @@
         var startState: LoadState = LoadState.Idle
         var endState: LoadState = LoadState.Idle
 
-        fun setState(type: LoadType, state: LoadState) {
+        fun setState(type: PageLoadType, state: LoadState) {
             // deduplicate signals
             when (type) {
-                LoadType.REFRESH -> {
+                PageLoadType.REFRESH -> {
                     if (refreshState == state) return
                     refreshState = state
                 }
-                LoadType.START -> {
+                PageLoadType.START -> {
                     if (startState == state) return
                     startState = state
                 }
-                LoadType.END -> {
+                PageLoadType.END -> {
                     if (endState == state) return
                     endState = state
                 }
@@ -927,12 +899,12 @@
          * @hide
          */
         @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) // protected otherwise.
-        abstract fun onStateChanged(type: LoadType, state: LoadState)
+        abstract fun onStateChanged(type: PageLoadType, state: LoadState)
 
         fun dispatchCurrentLoadState(callback: LoadStateListener) {
-            callback(LoadType.REFRESH, refreshState)
-            callback(LoadType.START, startState)
-            callback(LoadType.END, endState)
+            callback(PageLoadType.REFRESH, refreshState)
+            callback(PageLoadType.START, startState)
+            callback(PageLoadType.END, endState)
         }
     }
 
@@ -1143,7 +1115,7 @@
      * @hide
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-    open fun setInitialLoadState(loadType: LoadType, loadState: LoadState) {
+    open fun setInitialLoadState(loadType: PageLoadType, loadState: LoadState) {
     }
 
     /**
@@ -1170,7 +1142,7 @@
         this.refreshRetryCallback = refreshRetryCallback
     }
 
-    internal fun dispatchStateChange(type: LoadType, state: LoadState) {
+    internal fun dispatchStateChange(type: PageLoadType, state: LoadState) {
         loadStateListeners.removeAll { it.get() == null }
         loadStateListeners.forEach { it.get()?.invoke(type, state) }
     }
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
index 9614804..6b6c852 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
@@ -98,9 +98,6 @@
  * passed to a [PagedList] to be displayed in a `RecyclerView`
  */
 abstract class PagedSource<Key : Any, Value : Any> {
-    enum class LoadType {
-        INITIAL, START, END
-    }
 
     /**
      * Params for generic load request on a [PagedSource].
@@ -109,9 +106,9 @@
      */
     data class LoadParams<Key : Any>(
         /**
-         * [LoadType], for different behavior, e.g. only count initial load
+         * [PageLoadType], for different behavior, e.g. only count initial load
          */
-        val loadType: LoadType,
+        val loadType: PageLoadType,
         /**
          * Key for the page to be loaded
          */
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt b/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt
index c6bb7a7..31955c7 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedSourceWrapper.kt
@@ -43,14 +43,8 @@
     }
 
     override suspend fun load(params: LoadParams<Key>): LoadResult<Key, Value> {
-        val loadType = when (params.loadType) {
-            LoadType.INITIAL -> DataSource.LoadType.INITIAL
-            LoadType.START -> DataSource.LoadType.START
-            LoadType.END -> DataSource.LoadType.END
-        }
-
         val dataSourceParams = DataSource.Params(
-            loadType,
+            params.loadType,
             params.key,
             params.loadSize,
             params.placeholdersEnabled,
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
index 96708fc..e198b30 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
@@ -301,7 +301,7 @@
         )
     }
 
-    override fun onPageResultResolution(type: PagedList.LoadType, result: LoadResult<*, T>) {
+    override fun onPageResultResolution(type: PageLoadType, result: LoadResult<*, T>) {
         // ignored
     }
 
diff --git a/paging/common/src/main/kotlin/androidx/paging/Pager.kt b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
index eba5b66..848eb8f 100644
--- a/paging/common/src/main/kotlin/androidx/paging/Pager.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
@@ -17,7 +17,6 @@
 package androidx.paging
 
 import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
 import androidx.paging.PagedSource.KeyProvider
 import androidx.paging.PagedSource.LoadParams
 import androidx.paging.PagedSource.LoadResult
@@ -43,7 +42,7 @@
     private val detached = AtomicBoolean(false)
 
     var loadStateManager = object : PagedList.LoadStateManager() {
-        override fun onStateChanged(type: LoadType, state: LoadState) {
+        override fun onStateChanged(type: PageLoadType, state: LoadState) {
             pageConsumer.onStateChanged(type, state)
         }
     }
@@ -54,7 +53,7 @@
     init {
         prevKey = result.prevKey
         nextKey = result.nextKey
-        this.adjacentProvider.onPageResultResolution(LoadType.REFRESH, result)
+        this.adjacentProvider.onPageResultResolution(PageLoadType.REFRESH, result)
         totalCount = when (result.counted) {
             // only one of leadingNulls / offset may be used
             true -> result.itemsBefore + result.data.size + result.itemsAfter
@@ -62,7 +61,7 @@
         }
     }
 
-    private fun scheduleLoad(type: LoadType, params: LoadParams<K>) {
+    private fun scheduleLoad(type: PageLoadType, params: LoadParams<K>) {
         // Listen on the BG thread if the paged source is invalid, since it can be expensive.
         pagedListScope.launch(fetchDispatcher) {
             try {
@@ -86,18 +85,18 @@
         }
     }
 
-    private fun onLoadSuccess(type: LoadType, value: LoadResult<K, V>) {
+    private fun onLoadSuccess(type: PageLoadType, value: LoadResult<K, V>) {
         if (isDetached) return // abort!
 
         adjacentProvider.onPageResultResolution(type, value)
 
         if (pageConsumer.onPageResult(type, value)) {
             when (type) {
-                LoadType.START -> {
+                PageLoadType.START -> {
                     prevKey = value.prevKey
                     schedulePrepend()
                 }
-                LoadType.END -> {
+                PageLoadType.END -> {
                     nextKey = value.nextKey
                     scheduleAppend()
                 }
@@ -112,7 +111,7 @@
         }
     }
 
-    private fun onLoadError(type: LoadType, throwable: Throwable) {
+    private fun onLoadError(type: PageLoadType, throwable: Throwable) {
         if (isDetached) return // abort!
 
         // TODO: handle nesting
@@ -144,7 +143,7 @@
 
     private fun schedulePrepend() {
         if (!canPrepend()) {
-            onLoadSuccess(LoadType.START, LoadResult.empty())
+            onLoadSuccess(PageLoadType.START, LoadResult.empty())
             return
         }
 
@@ -157,21 +156,21 @@
             is KeyProvider.ItemKey -> keyProvider.getKey(adjacentProvider.firstLoadedItem!!)
         }
 
-        loadStateManager.setState(LoadType.START, LoadState.Loading)
+        loadStateManager.setState(PageLoadType.START, LoadState.Loading)
 
         val loadParams = LoadParams(
-            PagedSource.LoadType.START,
+            PageLoadType.START,
             key,
             config.pageSize,
             config.enablePlaceholders,
             config.pageSize
         )
-        scheduleLoad(LoadType.START, loadParams)
+        scheduleLoad(PageLoadType.START, loadParams)
     }
 
     private fun scheduleAppend() {
         if (!canAppend()) {
-            onLoadSuccess(LoadType.END, LoadResult.empty())
+            onLoadSuccess(PageLoadType.END, LoadResult.empty())
             return
         }
 
@@ -186,15 +185,15 @@
             )
         }
 
-        loadStateManager.setState(LoadType.END, LoadState.Loading)
+        loadStateManager.setState(PageLoadType.END, LoadState.Loading)
         val loadParams = LoadParams(
-            PagedSource.LoadType.END,
+            PageLoadType.END,
             key,
             config.pageSize,
             config.enablePlaceholders,
             config.pageSize
         )
-        scheduleLoad(LoadType.END, loadParams)
+        scheduleLoad(PageLoadType.END, loadParams)
     }
 
     fun retry() {
@@ -212,9 +211,9 @@
         /**
          * @return `true` if we need to fetch more
          */
-        fun onPageResult(type: LoadType, pageResult: LoadResult<*, V>): Boolean
+        fun onPageResult(type: PageLoadType, pageResult: LoadResult<*, V>): Boolean
 
-        fun onStateChanged(type: LoadType, state: LoadState)
+        fun onStateChanged(type: PageLoadType, state: LoadState)
     }
 
     internal interface AdjacentProvider<V : Any> {
@@ -230,7 +229,7 @@
          * implementation of the AdjacentProvider to handle this (generally by ignoring this call if
          * dropping is supported).
          */
-        fun onPageResultResolution(type: LoadType, result: LoadResult<*, V>)
+        fun onPageResultResolution(type: PageLoadType, result: LoadResult<*, V>)
     }
 
     internal class SimpleAdjacentProvider<V : Any> : AdjacentProvider<V> {
@@ -247,16 +246,16 @@
         private var leadingUnloadedCount: Int = 0
         private var trailingUnloadedCount: Int = 0
 
-        override fun onPageResultResolution(type: LoadType, result: LoadResult<*, V>) {
+        override fun onPageResultResolution(type: PageLoadType, result: LoadResult<*, V>) {
             if (result.data.isEmpty()) return
 
-            if (type == LoadType.START) {
+            if (type == PageLoadType.START) {
                 firstLoadedItemIndex -= result.data.size
                 firstLoadedItem = result.data[0]
                 if (counted) {
                     leadingUnloadedCount -= result.data.size
                 }
-            } else if (type == LoadType.END) {
+            } else if (type == PageLoadType.END) {
                 lastLoadedItemIndex += result.data.size
                 lastLoadedItem = result.data.last()
                 if (counted) {
diff --git a/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt b/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
index 64b9fb4..8563b66 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PositionalDataSource.kt
@@ -323,7 +323,7 @@
 
     @Suppress("RedundantVisibilityModifier") // Metalava doesn't inherit visibility properly.
     internal final override suspend fun load(params: Params<Int>): BaseResult<T> {
-        if (params.type == LoadType.INITIAL) {
+        if (params.type == PageLoadType.REFRESH) {
             var initialPosition = 0
             var initialLoadSize = params.initialLoadSize
             if (params.key != null) {
@@ -352,7 +352,7 @@
         } else {
             var startIndex = params.key!!
             var loadSize = params.pageSize
-            if (params.type == LoadType.START) {
+            if (params.type == PageLoadType.START) {
                 loadSize = minOf(loadSize, startIndex + 1)
                 startIndex = startIndex - loadSize + 1
             }
diff --git a/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt b/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
index d83b656..5d1529f 100644
--- a/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/ContiguousPagedListTest.kt
@@ -21,7 +21,6 @@
 import androidx.paging.PagedList.Callback
 import androidx.paging.PagedList.Config
 import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
 import androidx.paging.futures.DirectDispatcher
 import androidx.testutils.TestDispatcher
 import com.nhaarman.mockitokotlin2.mock
@@ -64,9 +63,9 @@
 
         override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Item> {
             return when (params.loadType) {
-                LoadType.INITIAL -> loadInitial(params)
-                LoadType.START -> loadBefore(params)
-                LoadType.END -> loadAfter(params)
+                PageLoadType.REFRESH -> loadInitial(params)
+                PageLoadType.START -> loadBefore(params)
+                PageLoadType.END -> loadAfter(params)
             }
         }
 
@@ -127,7 +126,7 @@
         return data
     }
 
-    private fun <E : Any> PagedList<E>.addLoadStateCapture(desiredType: LoadType):
+    private fun <E : Any> PagedList<E>.addLoadStateCapture(desiredType: PageLoadType):
             MutableList<StateChange> {
         val list = mutableListOf<StateChange>()
         this.addWeakLoadStateListener { type, state ->
@@ -567,11 +566,11 @@
     @Test
     fun loadingListenerAppend() {
         val pagedList = createCountedPagedList(0)
-        val states = pagedList.addLoadStateCapture(LoadType.END)
+        val states = pagedList.addLoadStateCapture(PageLoadType.END)
 
         // No loading going on currently
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Idle)),
+            listOf(StateChange(PageLoadType.END, LoadState.Idle)),
             states.getAllAndClear()
         )
         verifyRange(0, 40, pagedList)
@@ -580,7 +579,7 @@
         pagedList.loadAround(35)
         mainThread.executeAll()
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Loading)),
+            listOf(StateChange(PageLoadType.END, LoadState.Loading)),
             states.getAllAndClear()
         )
         verifyRange(0, 40, pagedList)
@@ -588,7 +587,7 @@
         // load finishes
         drain()
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Idle)),
+            listOf(StateChange(PageLoadType.END, LoadState.Idle)),
             states.getAllAndClear()
         )
         verifyRange(0, 60, pagedList)
@@ -599,7 +598,7 @@
         pagedList.loadAround(55)
         mainThread.executeAll()
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Loading)),
+            listOf(StateChange(PageLoadType.END, LoadState.Loading)),
             states.getAllAndClear()
         )
         verifyRange(0, 60, pagedList)
@@ -607,7 +606,7 @@
         // load now in error state
         drain()
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Error(EXCEPTION, true))),
+            listOf(StateChange(PageLoadType.END, LoadState.Error(EXCEPTION, true))),
             states.getAllAndClear()
         )
         verifyRange(0, 60, pagedList)
@@ -616,14 +615,14 @@
         pagedList.retry()
         mainThread.executeAll()
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Loading)),
+            listOf(StateChange(PageLoadType.END, LoadState.Loading)),
             states.getAllAndClear()
         )
 
         // load finishes
         drain()
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Idle)),
+            listOf(StateChange(PageLoadType.END, LoadState.Idle)),
             states.getAllAndClear()
         )
         verifyRange(0, 80, pagedList)
@@ -639,7 +638,7 @@
             prefetchDistance = 1,
             maxSize = 3
         )
-        val states = pagedList.addLoadStateCapture(LoadType.START)
+        val states = pagedList.addLoadStateCapture(PageLoadType.START)
 
         // load 3 pages - 2nd, 3rd, 4th
         pagedList.loadAround(if (placeholdersEnabled) 2 else 0)
@@ -647,9 +646,9 @@
         verifyRange(1, 3, pagedList)
         assertEquals(
             listOf(
-                StateChange(LoadType.START, LoadState.Idle),
-                StateChange(LoadType.START, LoadState.Loading),
-                StateChange(LoadType.START, LoadState.Idle)
+                StateChange(PageLoadType.START, LoadState.Idle),
+                StateChange(PageLoadType.START, LoadState.Loading),
+                StateChange(PageLoadType.START, LoadState.Idle)
             ),
             states.getAllAndClear()
         )
@@ -661,8 +660,8 @@
         verifyRange(1, 3, pagedList)
         assertEquals(
             listOf(
-                StateChange(LoadType.START, LoadState.Loading),
-                StateChange(LoadType.START, LoadState.Error(EXCEPTION, true))
+                StateChange(PageLoadType.START, LoadState.Loading),
+                StateChange(PageLoadType.START, LoadState.Error(EXCEPTION, true))
             ),
             states.getAllAndClear()
         )
@@ -671,7 +670,7 @@
         pagedList.loadAround(if (placeholdersEnabled) 3 else 2)
         drain()
         assertEquals(
-            listOf(StateChange(LoadType.START, LoadState.Idle)),
+            listOf(StateChange(PageLoadType.START, LoadState.Idle)),
             states.getAllAndClear()
         )
         verifyRange(2, 3, pagedList)
@@ -687,7 +686,7 @@
             prefetchDistance = 1,
             maxSize = 3
         )
-        val states = pagedList.addLoadStateCapture(LoadType.END)
+        val states = pagedList.addLoadStateCapture(PageLoadType.END)
 
         // load 3 pages - 2nd, 3rd, 4th
         pagedList.loadAround(if (placeholdersEnabled) 2 else 0)
@@ -695,9 +694,9 @@
         verifyRange(1, 3, pagedList)
         assertEquals(
             listOf(
-                StateChange(LoadType.END, LoadState.Idle),
-                StateChange(LoadType.END, LoadState.Loading),
-                StateChange(LoadType.END, LoadState.Idle)
+                StateChange(PageLoadType.END, LoadState.Idle),
+                StateChange(PageLoadType.END, LoadState.Loading),
+                StateChange(PageLoadType.END, LoadState.Idle)
             ),
             states.getAllAndClear()
         )
@@ -709,8 +708,8 @@
         verifyRange(1, 3, pagedList)
         assertEquals(
             listOf(
-                StateChange(LoadType.END, LoadState.Loading),
-                StateChange(LoadType.END, LoadState.Error(EXCEPTION, true))
+                StateChange(PageLoadType.END, LoadState.Loading),
+                StateChange(PageLoadType.END, LoadState.Error(EXCEPTION, true))
             ),
             states.getAllAndClear()
         )
@@ -719,7 +718,7 @@
         pagedList.loadAround(if (placeholdersEnabled) 1 else 0)
         drain()
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Idle)),
+            listOf(StateChange(PageLoadType.END, LoadState.Idle)),
             states.getAllAndClear()
         )
         verifyRange(0, 3, pagedList)
@@ -731,7 +730,7 @@
         val pagedList = createCountedPagedList(0)
         val states = mutableListOf<StateChange>()
         pagedList.addWeakLoadStateListener { type, state ->
-            if (type == LoadType.END) {
+            if (type == PageLoadType.END) {
                 states.add(StateChange(type, state))
             }
         }
@@ -741,9 +740,9 @@
         drain()
         assertEquals(
             listOf(
-                StateChange(LoadType.END, LoadState.Idle),
-                StateChange(LoadType.END, LoadState.Loading),
-                StateChange(LoadType.END, LoadState.Error(EXCEPTION, true))
+                StateChange(PageLoadType.END, LoadState.Idle),
+                StateChange(PageLoadType.END, LoadState.Loading),
+                StateChange(PageLoadType.END, LoadState.Error(EXCEPTION, true))
             ),
             states.getAllAndClear()
         )
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
index 23dee77..c05bcf2 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagedListTest.kt
@@ -17,8 +17,11 @@
 package androidx.paging
 
 import androidx.paging.ContiguousPagedListTest.Companion.EXCEPTION
+import androidx.paging.PageLoadType.REFRESH
+import androidx.paging.PagedList.Builder
+import androidx.paging.PagedList.Config
+import androidx.paging.PagedList.LoadState
 import androidx.paging.PagedList.LoadStateManager
-import androidx.paging.PagedList.LoadType.REFRESH
 import androidx.paging.futures.DirectDispatcher
 import androidx.testutils.TestDispatcher
 import androidx.testutils.TestExecutor
@@ -43,7 +46,7 @@
 
             override suspend fun load(params: LoadParams<Int>): LoadResult<Int, String> =
                 when (params.loadType) {
-                    LoadType.INITIAL -> LoadResult(
+                    REFRESH -> LoadResult(
                         data = listOf("a"),
                         itemsBefore = 0,
                         itemsAfter = 0
@@ -62,7 +65,7 @@
     @Test
     fun createLegacy() {
         @Suppress("DEPRECATION")
-        val pagedList = PagedList.Builder(ListDataSource(ITEMS), 100)
+        val pagedList = Builder(ListDataSource(ITEMS), 100)
             .setNotifyExecutor(TestExecutor())
             .setFetchExecutor(TestExecutor())
             .build()
@@ -72,7 +75,7 @@
 
     @Test
     fun createAsync() {
-        val config = PagedList.Config.Builder()
+        val config = Config.Builder()
             .setPageSize(10)
             .setEnablePlaceholders(false)
             .build()
@@ -112,7 +115,7 @@
             override fun isRetryableError(error: Throwable) = false
         }
 
-        val config = PagedList.Config.Builder()
+        val config = Config.Builder()
             .setPageSize(10)
             .setEnablePlaceholders(false)
             .build()
@@ -141,7 +144,7 @@
 
     @Test
     fun defaults() = runBlocking {
-        val pagedList = PagedList.Builder(pagedSource, config)
+        val pagedList = Builder(pagedSource, config)
             .setNotifyDispatcher(DirectDispatcher)
             .setFetchDispatcher(DirectDispatcher)
             .buildAsync()
@@ -154,13 +157,13 @@
     fun setState_Error() {
         var onStateChangeCalls = 0
         val loadStateManager = object : LoadStateManager() {
-            override fun onStateChanged(type: PagedList.LoadType, state: PagedList.LoadState) {
+            override fun onStateChanged(type: PageLoadType, state: LoadState) {
                 onStateChangeCalls++
             }
         }
 
-        loadStateManager.setState(REFRESH, PagedList.LoadState.Error(EXCEPTION, true))
-        loadStateManager.setState(REFRESH, PagedList.LoadState.Error(EXCEPTION, true))
+        loadStateManager.setState(REFRESH, LoadState.Error(EXCEPTION, true))
+        loadStateManager.setState(REFRESH, LoadState.Error(EXCEPTION, true))
 
         assertEquals(1, onStateChangeCalls)
     }
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt
index 438fdae..e4ac159 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagedSourceTest.kt
@@ -19,7 +19,6 @@
 import androidx.paging.PagedSource.LoadParams
 import androidx.paging.PagedSource.LoadResult
 import androidx.paging.PagedSource.LoadResult.Companion.COUNT_UNDEFINED
-import androidx.paging.PagedSource.LoadType
 import kotlinx.coroutines.runBlocking
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertSame
@@ -43,7 +42,7 @@
     ): LoadResult<Key, Item> {
         return pagedSource.load(
             LoadParams(
-                LoadType.INITIAL,
+                PageLoadType.REFRESH,
                 key,
                 initialLoadSize,
                 enablePlaceholders,
@@ -65,7 +64,7 @@
 
             // Verify error is propagated correctly.
             pagedSource.enqueueError()
-            val errorParams = LoadParams(LoadType.INITIAL, key, 10, false, 10)
+            val errorParams = LoadParams(PageLoadType.REFRESH, key, 10, false, 10)
             assertFailsWith<CustomException> {
                 pagedSource.load(errorParams)
             }
@@ -197,7 +196,7 @@
 
         runBlocking {
             val key = dataSource.keyProvider.getKey(ITEMS_BY_NAME_ID[5])
-            val params = LoadParams(LoadType.START, key, 5, false, 5)
+            val params = LoadParams(PageLoadType.START, key, 5, false, 5)
             val observed = dataSource.load(params).data
 
             assertEquals(ITEMS_BY_NAME_ID.subList(0, 5), observed)
@@ -205,7 +204,7 @@
             // Verify error is propagated correctly.
             dataSource.enqueueError()
             assertFailsWith<CustomException> {
-                val errorParams = LoadParams(LoadType.START, key, 5, false, 5)
+                val errorParams = LoadParams(PageLoadType.START, key, 5, false, 5)
                 dataSource.load(errorParams)
             }
         }
@@ -217,7 +216,7 @@
 
         runBlocking {
             val key = dataSource.keyProvider.getKey(ITEMS_BY_NAME_ID[5])
-            val params = LoadParams(LoadType.END, key, 5, false, 5)
+            val params = LoadParams(PageLoadType.END, key, 5, false, 5)
             val observed = dataSource.load(params).data
 
             assertEquals(ITEMS_BY_NAME_ID.subList(6, 11), observed)
@@ -225,7 +224,7 @@
             // Verify error is propagated correctly.
             dataSource.enqueueError()
             assertFailsWith<CustomException> {
-                val errorParams = LoadParams(LoadType.END, key, 5, false, 5)
+                val errorParams = LoadParams(PageLoadType.END, key, 5, false, 5)
                 dataSource.load(errorParams)
             }
         }
@@ -269,9 +268,9 @@
 
         override suspend fun load(params: LoadParams<Key>): LoadResult<Key, Item> {
             return when (params.loadType) {
-                LoadType.INITIAL -> loadInitial(params)
-                LoadType.START -> loadBefore(params)
-                LoadType.END -> loadAfter(params)
+                PageLoadType.REFRESH -> loadInitial(params)
+                PageLoadType.START -> loadBefore(params)
+                PageLoadType.END -> loadAfter(params)
             }
         }
 
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
index 72e1fa7..ed28898 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
@@ -18,7 +18,6 @@
 
 import androidx.paging.PagedList.Config
 import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
 import androidx.paging.PagedSource.LoadResult
 import androidx.paging.futures.DirectDispatcher
 import androidx.testutils.TestExecutor
@@ -67,7 +66,7 @@
         PositionalDataSource.RangeResult(data.subList(start, end)).toLoadResult<Int>()
 
     private data class Result(
-        val type: LoadType,
+        val type: PageLoadType,
         val pageResult: LoadResult<*, String>
     )
 
@@ -88,14 +87,14 @@
         }
 
         override fun onPageResult(
-            type: LoadType,
+            type: PageLoadType,
             pageResult: LoadResult<*, String>
         ): Boolean {
             results.add(Result(type, pageResult))
             return false
         }
 
-        override fun onStateChanged(type: LoadType, state: LoadState) {
+        override fun onStateChanged(type: PageLoadType, state: LoadState) {
             stateChanges.add(StateChange(type, state))
         }
     }
@@ -135,15 +134,15 @@
 
         assertTrue(consumer.takeResults().isEmpty())
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Loading)),
+            listOf(StateChange(PageLoadType.END, LoadState.Loading)),
             consumer.takeStateChanges()
         )
 
         testExecutor.executeAll()
 
-        assertEquals(listOf(Result(LoadType.END, rangeResult(6, 8))), consumer.takeResults())
+        assertEquals(listOf(Result(PageLoadType.END, rangeResult(6, 8))), consumer.takeResults())
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Idle)),
+            listOf(StateChange(PageLoadType.END, LoadState.Idle)),
             consumer.takeStateChanges()
         )
     }
@@ -157,15 +156,15 @@
 
         assertTrue(consumer.takeResults().isEmpty())
         assertEquals(
-            listOf(StateChange(LoadType.START, LoadState.Loading)),
+            listOf(StateChange(PageLoadType.START, LoadState.Loading)),
             consumer.takeStateChanges()
         )
 
         testExecutor.executeAll()
 
-        assertEquals(listOf(Result(LoadType.START, rangeResult(2, 4))), consumer.takeResults())
+        assertEquals(listOf(Result(PageLoadType.START, rangeResult(2, 4))), consumer.takeResults())
         assertEquals(
-            listOf(StateChange(LoadType.START, LoadState.Idle)),
+            listOf(StateChange(PageLoadType.START, LoadState.Idle)),
             consumer.takeStateChanges()
         )
     }
@@ -182,16 +181,16 @@
 
         assertEquals(
             listOf(
-                Result(LoadType.END, rangeResult(6, 8)),
-                Result(LoadType.END, rangeResult(8, 9))
+                Result(PageLoadType.END, rangeResult(6, 8)),
+                Result(PageLoadType.END, rangeResult(8, 9))
             ), consumer.takeResults()
         )
         assertEquals(
             listOf(
-                StateChange(LoadType.END, LoadState.Loading),
-                StateChange(LoadType.END, LoadState.Idle),
-                StateChange(LoadType.END, LoadState.Loading),
-                StateChange(LoadType.END, LoadState.Idle)
+                StateChange(PageLoadType.END, LoadState.Loading),
+                StateChange(PageLoadType.END, LoadState.Idle),
+                StateChange(PageLoadType.END, LoadState.Loading),
+                StateChange(PageLoadType.END, LoadState.Idle)
             ),
             consumer.takeStateChanges()
         )
@@ -209,16 +208,16 @@
 
         assertEquals(
             listOf(
-                Result(LoadType.START, rangeResult(2, 4)),
-                Result(LoadType.START, rangeResult(0, 2))
+                Result(PageLoadType.START, rangeResult(2, 4)),
+                Result(PageLoadType.START, rangeResult(0, 2))
             ), consumer.takeResults()
         )
         assertEquals(
             listOf(
-                StateChange(LoadType.START, LoadState.Loading),
-                StateChange(LoadType.START, LoadState.Idle),
-                StateChange(LoadType.START, LoadState.Loading),
-                StateChange(LoadType.START, LoadState.Idle)
+                StateChange(PageLoadType.START, LoadState.Loading),
+                StateChange(PageLoadType.START, LoadState.Idle),
+                StateChange(PageLoadType.START, LoadState.Loading),
+                StateChange(PageLoadType.START, LoadState.Idle)
             ),
             consumer.takeStateChanges()
         )
@@ -233,11 +232,11 @@
 
         // Pager triggers an immediate empty response here, so we don't need to flush the executor
         assertEquals(
-            listOf(Result(LoadType.END, LoadResult.empty<Int, String>())),
+            listOf(Result(PageLoadType.END, LoadResult.empty<Int, String>())),
             consumer.takeResults()
         )
         assertEquals(
-            listOf(StateChange(LoadType.END, LoadState.Done)),
+            listOf(StateChange(PageLoadType.END, LoadState.Done)),
             consumer.takeStateChanges()
         )
     }
@@ -251,11 +250,11 @@
 
         // Pager triggers an immediate empty response here, so we don't need to flush the executor
         assertEquals(
-            listOf(Result(LoadType.START, LoadResult.empty<Int, String>())),
+            listOf(Result(PageLoadType.START, LoadResult.empty<Int, String>())),
             consumer.takeResults()
         )
         assertEquals(
-            listOf(StateChange(LoadType.START, LoadState.Done)),
+            listOf(StateChange(PageLoadType.START, LoadState.Done)),
             consumer.takeStateChanges()
         )
     }
diff --git a/paging/common/src/test/kotlin/androidx/paging/StateChange.kt b/paging/common/src/test/kotlin/androidx/paging/StateChange.kt
index 31ba66e..c7fd2bc 100644
--- a/paging/common/src/test/kotlin/androidx/paging/StateChange.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/StateChange.kt
@@ -17,6 +17,5 @@
 package androidx.paging
 
 import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
 
-internal data class StateChange(val type: LoadType, val state: LoadState)
+internal data class StateChange(val type: PageLoadType, val state: LoadState)
diff --git a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt
index 857c84d..fa1a3b8 100644
--- a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt
+++ b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/ItemDataSource.kt
@@ -18,6 +18,7 @@
 
 import android.graphics.Color
 import androidx.annotation.ColorInt
+import androidx.paging.PageLoadType
 import androidx.paging.PagedSource
 import java.util.ArrayList
 import java.util.concurrent.atomic.AtomicBoolean
@@ -31,7 +32,7 @@
     override val keyProvider = KeyProvider.Positional
 
     override suspend fun load(params: LoadParams<Int>) = when (params.loadType) {
-        LoadType.INITIAL -> loadInitial(params)
+        PageLoadType.REFRESH -> loadInitial(params)
         else -> loadRange(params)
     }
 
diff --git a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt
index b25b23d..063a4e5 100644
--- a/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt
+++ b/paging/integration-tests/testapp/src/main/java/androidx/paging/integration/testapp/custom/PagedListSampleActivity.kt
@@ -21,14 +21,15 @@
 import androidx.activity.viewModels
 import androidx.appcompat.app.AppCompatActivity
 import androidx.lifecycle.Observer
+import androidx.paging.PageLoadType
 import androidx.paging.PagedList
 import androidx.paging.PagedList.LoadState.Done
 import androidx.paging.PagedList.LoadState.Error
 import androidx.paging.PagedList.LoadState.Idle
 import androidx.paging.PagedList.LoadState.Loading
-import androidx.paging.PagedList.LoadType.END
-import androidx.paging.PagedList.LoadType.REFRESH
-import androidx.paging.PagedList.LoadType.START
+import androidx.paging.PageLoadType.END
+import androidx.paging.PageLoadType.REFRESH
+import androidx.paging.PageLoadType.START
 import androidx.paging.PagedListAdapter
 import androidx.paging.integration.testapp.R
 import androidx.recyclerview.widget.RecyclerView
@@ -75,7 +76,7 @@
             adapter.currentList?.retry()
         }
 
-        adapter.addLoadStateListener { type: PagedList.LoadType, state: PagedList.LoadState ->
+        adapter.addLoadStateListener { type: PageLoadType, state: PagedList.LoadState ->
             val button = when (type) {
                 REFRESH -> buttonRefresh
                 START -> buttonStart
diff --git a/paging/runtime/api/3.0.0-alpha01.txt b/paging/runtime/api/3.0.0-alpha01.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/3.0.0-alpha01.txt
+++ b/paging/runtime/api/3.0.0-alpha01.txt
@@ -4,13 +4,13 @@
   public class AsyncPagedListDiffer<T> {
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method public T? getItem(int index);
     method public int getItemCount();
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
   public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method protected T? getItem(int position);
     method public int getItemCount();
     method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
     method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
-    method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
     method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
     property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/api/current.txt b/paging/runtime/api/current.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/current.txt
+++ b/paging/runtime/api/current.txt
@@ -4,13 +4,13 @@
   public class AsyncPagedListDiffer<T> {
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method public T? getItem(int index);
     method public int getItemCount();
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
   public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method protected T? getItem(int position);
     method public int getItemCount();
     method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
     method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
-    method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
     method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
     property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/api/restricted_3.0.0-alpha01.txt b/paging/runtime/api/restricted_3.0.0-alpha01.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/restricted_3.0.0-alpha01.txt
+++ b/paging/runtime/api/restricted_3.0.0-alpha01.txt
@@ -4,13 +4,13 @@
   public class AsyncPagedListDiffer<T> {
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method public T? getItem(int index);
     method public int getItemCount();
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
   public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method protected T? getItem(int position);
     method public int getItemCount();
     method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
     method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
-    method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
     method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
     property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/api/restricted_current.txt b/paging/runtime/api/restricted_current.txt
index d990cd8..0a9333a 100644
--- a/paging/runtime/api/restricted_current.txt
+++ b/paging/runtime/api/restricted_current.txt
@@ -4,13 +4,13 @@
   public class AsyncPagedListDiffer<T> {
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method public T? getItem(int index);
     method public int getItemCount();
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> listener);
     method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
     method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
@@ -50,14 +50,14 @@
   public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
     ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
     ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
-    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public androidx.paging.PagedList<T>? getCurrentList();
     method protected T? getItem(int position);
     method public int getItemCount();
     method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
     method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
-    method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state);
-    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
+    method public void onLoadStateChanged(androidx.paging.PageLoadType type, androidx.paging.PagedList.LoadState state);
+    method public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.PageLoadType,? super androidx.paging.PagedList.LoadState,kotlin.Unit> callback);
     method public void submitList(androidx.paging.PagedList<T>? pagedList);
     method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
     property public androidx.paging.PagedList<T>? currentList;
diff --git a/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
index 1d53152..9ac83e2 100644
--- a/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
+++ b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListBuilderTest.kt
@@ -25,7 +25,7 @@
 import androidx.paging.PagedList.LoadState.Error
 import androidx.paging.PagedList.LoadState.Idle
 import androidx.paging.PagedList.LoadState.Loading
-import androidx.paging.PagedList.LoadType.REFRESH
+import androidx.paging.PageLoadType.REFRESH
 import androidx.test.filters.SmallTest
 import androidx.testutils.TestDispatcher
 import androidx.testutils.TestExecutor
@@ -64,7 +64,7 @@
     }
 
     private data class LoadState(
-        val type: PagedList.LoadType,
+        val type: PageLoadType,
         val state: PagedList.LoadState
     )
 
@@ -111,7 +111,7 @@
             override val keyProvider = KeyProvider.Positional
 
             override suspend fun load(params: LoadParams<Int>) = when (params.loadType) {
-                LoadType.INITIAL -> loadInitial(params)
+                PageLoadType.REFRESH -> loadInitial(params)
                 else -> loadRange()
             }
 
diff --git a/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt b/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt
index cb2d31d..506e5dc 100644
--- a/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt
+++ b/paging/runtime/src/main/java/androidx/paging/AsyncPagedListDiffer.kt
@@ -21,7 +21,6 @@
 import androidx.lifecycle.LiveData
 import androidx.paging.PagedList.LoadState
 import androidx.paging.PagedList.LoadStateManager
-import androidx.paging.PagedList.LoadType
 import androidx.recyclerview.widget.AdapterListUpdateCallback
 import androidx.recyclerview.widget.AsyncDifferConfig
 import androidx.recyclerview.widget.DiffUtil
@@ -141,7 +140,7 @@
     internal var maxScheduledGeneration: Int = 0
 
     private val loadStateManager: LoadStateManager = object : LoadStateManager() {
-        override fun onStateChanged(type: LoadType, state: LoadState) {
+        override fun onStateChanged(type: PageLoadType, state: LoadState) {
             // Don't need to post - PagedList will already have done that
             loadStateListeners.forEach { it(type, state) }
         }
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
index 0a7be66..c6a5582 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
@@ -18,7 +18,7 @@
 
 import androidx.arch.core.executor.ArchTaskExecutor
 import androidx.lifecycle.LiveData
-import androidx.paging.PagedList.LoadType.REFRESH
+import androidx.paging.PageLoadType.REFRESH
 import androidx.paging.PagedList.LoadState.Error
 import androidx.paging.PagedList.LoadState.Loading
 import kotlinx.coroutines.CoroutineDispatcher
diff --git a/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt b/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
index 9f10b64..418fd3e 100644
--- a/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
+++ b/paging/runtime/src/main/java/androidx/paging/PagedListAdapter.kt
@@ -17,7 +17,6 @@
 package androidx.paging
 
 import androidx.paging.PagedList.LoadState
-import androidx.paging.PagedList.LoadType
 import androidx.recyclerview.widget.AdapterListUpdateCallback
 import androidx.recyclerview.widget.AsyncDifferConfig
 import androidx.recyclerview.widget.DiffUtil
@@ -231,10 +230,10 @@
      * REFRESH events can be used to drive a `SwipeRefreshLayout`, or START/END events
      * can be used to drive loading spinner items in the Adapter.
      *
-     * @param type [LoadType] Can be START, END, or REFRESH
+     * @param type [PageLoadType] Can be START, END, or REFRESH
      * @param state [LoadState] IDLE, LOADING, DONE, ERROR, or RETRYABLE_ERROR
      */
-    open fun onLoadStateChanged(type: LoadType, state: LoadState) {
+    open fun onLoadStateChanged(type: PageLoadType, state: LoadState) {
     }
 
     /**
diff --git a/palette/palette/build.gradle b/palette/palette/build.gradle
index 1a785db..87eb258b 100644
--- a/palette/palette/build.gradle
+++ b/palette/palette/build.gradle
@@ -9,7 +9,7 @@
 }
 
 dependencies {
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
 
     annotationProcessor(NULLAWAY)
diff --git a/percentlayout/percentlayout/build.gradle b/percentlayout/percentlayout/build.gradle
index 5b2ac05..e5c8470 100644
--- a/percentlayout/percentlayout/build.gradle
+++ b/percentlayout/percentlayout/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api(ANDROIDX_ANNOTATION)
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/preference/preference/build.gradle b/preference/preference/build.gradle
index 43b0f07..8235c7a 100644
--- a/preference/preference/build.gradle
+++ b/preference/preference/build.gradle
@@ -30,7 +30,7 @@
     implementation("androidx.annotation:annotation:1.1.0")
     api("androidx.appcompat:appcompat:1.1.0-rc01")
     // TODO: change to alpha05 after release
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.fragment:fragment:1.1.0-rc01")
     api("androidx.recyclerview:recyclerview:1.0.0")
diff --git a/recyclerview/recyclerview-selection/build.gradle b/recyclerview/recyclerview-selection/build.gradle
index ac2f787..a364be0 100644
--- a/recyclerview/recyclerview-selection/build.gradle
+++ b/recyclerview/recyclerview-selection/build.gradle
@@ -27,7 +27,7 @@
 dependencies {
     api(project(":recyclerview:recyclerview"))
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/recyclerview/recyclerview/api/1.1.0-beta04.txt b/recyclerview/recyclerview/api/1.1.0-beta04.txt
new file mode 100644
index 0000000..2e41ff1
--- /dev/null
+++ b/recyclerview/recyclerview/api/1.1.0-beta04.txt
@@ -0,0 +1,1037 @@
+// Signature format: 3.0
+package androidx.recyclerview.widget {
+
+  public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class AsyncDifferConfig<T> {
+    method public java.util.concurrent.Executor getBackgroundThreadExecutor();
+    method public androidx.recyclerview.widget.DiffUtil.ItemCallback<T!> getDiffCallback();
+  }
+
+  public static final class AsyncDifferConfig.Builder<T> {
+    ctor public AsyncDifferConfig.Builder(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    method public androidx.recyclerview.widget.AsyncDifferConfig<T!> build();
+    method public androidx.recyclerview.widget.AsyncDifferConfig.Builder<T!> setBackgroundThreadExecutor(java.util.concurrent.Executor!);
+  }
+
+  public class AsyncListDiffer<T> {
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.ListUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public void addListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method public void removeListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public static interface AsyncListDiffer.ListListener<T> {
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+  }
+
+  public class AsyncListUtil<T> {
+    ctor public AsyncListUtil(Class<T!>, int, androidx.recyclerview.widget.AsyncListUtil.DataCallback<T!>, androidx.recyclerview.widget.AsyncListUtil.ViewCallback);
+    method public T? getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public abstract static class AsyncListUtil.DataCallback<T> {
+    ctor public AsyncListUtil.DataCallback();
+    method @WorkerThread public abstract void fillData(T![], int, int);
+    method @WorkerThread public int getMaxCachedTiles();
+    method @WorkerThread public void recycleData(T![], int);
+    method @WorkerThread public abstract int refreshData();
+  }
+
+  public abstract static class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method @UiThread public void extendRangeInto(int[], int[], int);
+    method @UiThread public abstract void getItemRangeInto(int[]);
+    method @UiThread public abstract void onDataRefresh();
+    method @UiThread public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class DiffUtil {
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback);
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback, boolean);
+  }
+
+  public abstract static class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public Object? getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public int convertNewPositionToOld(@IntRange(from=0) int);
+    method public int convertOldPositionToNew(@IntRange(from=0) int);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.ListUpdateCallback);
+    field public static final int NO_POSITION = -1; // 0xffffffff
+  }
+
+  public abstract static class DiffUtil.ItemCallback<T> {
+    ctor public DiffUtil.ItemCallback();
+    method public abstract boolean areContentsTheSame(T, T);
+    method public abstract boolean areItemsTheSame(T, T);
+    method public Object? getChangePayload(T, T);
+  }
+
+  public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context!, int);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public class GridLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public GridLayoutManager(android.content.Context!, int);
+    ctor public GridLayoutManager(android.content.Context!, int, int, boolean);
+    method public int getSpanCount();
+    method public androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup! getSpanSizeLookup();
+    method public boolean isUsingSpansToEstimateScrollbarDimensions();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup!);
+    method public void setUsingSpansToEstimateScrollbarDimensions(boolean);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public abstract static class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanGroupIndexCache();
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanGroupIndexCacheEnabled();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanGroupIndexCacheEnabled(boolean);
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class ItemTouchHelper extends androidx.recyclerview.widget.RecyclerView.ItemDecoration implements androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(androidx.recyclerview.widget.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public abstract static class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(androidx.recyclerview.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static androidx.recyclerview.widget.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
+    method public float getSwipeThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
+    method public int interpolateOutOfBoundsScroll(androidx.recyclerview.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
+    method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
+    method public abstract void onSwiped(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public abstract static class ItemTouchHelper.SimpleCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static interface ItemTouchHelper.ViewDropHandler {
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public interface ItemTouchUIUtil {
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
+  }
+
+  public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public LinearLayoutManager(android.content.Context!);
+    ctor public LinearLayoutManager(android.content.Context!, int, boolean);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
+    method public int getInitialPrefetchItemCount();
+    method public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setOrientation(int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+  public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context!);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator! mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
+    field protected android.graphics.PointF! mTargetVector;
+  }
+
+  public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[]! calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View! findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public abstract class ListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor protected ListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor protected ListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method protected T! getItem(int);
+    method public int getItemCount();
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public interface ListUpdateCallback {
+    method public void onChanged(int, int, Object?);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract class OrientationHelper {
+    method public static androidx.recyclerview.widget.OrientationHelper! createHorizontalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public static androidx.recyclerview.widget.OrientationHelper! createOrientationHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int);
+    method public static androidx.recyclerview.widget.OrientationHelper! createVerticalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int getDecoratedEnd(android.view.View!);
+    method public abstract int getDecoratedMeasurement(android.view.View!);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View!);
+    method public abstract int getDecoratedStart(android.view.View!);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! getLayoutManager();
+    method public abstract int getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View!);
+    method public abstract int getTransformedStartWithDecoration(android.view.View!);
+    method public abstract void offsetChild(android.view.View!, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final androidx.recyclerview.widget.RecyclerView.LayoutManager! mLayoutManager;
+  }
+
+  public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method protected androidx.recyclerview.widget.LinearSmoothScroller! createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public final void dispatchNestedScroll(int, int, int, int, int[]!, int, int[]);
+    method public boolean drawChild(android.graphics.Canvas!, android.view.View!, long);
+    method public android.view.View? findChildViewUnder(float, float);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findContainingViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForAdapterPosition(int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! findViewHolderForItemId(long);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForLayoutPosition(int);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method @Deprecated public int getChildPosition(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! getChildViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate? getCompatAccessibilityDelegate();
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator? getItemAnimator();
+    method public androidx.recyclerview.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public androidx.recyclerview.widget.RecyclerView.OnFlingListener? getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public androidx.recyclerview.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method @Deprecated public boolean isLayoutFrozen();
+    method public final boolean isLayoutSuppressed();
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas!);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(@Px int, @Px int);
+    method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
+    method public void removeOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void scrollToPosition(int);
+    method public void setAccessibilityDelegateCompat(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate?);
+    method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
+    method public void setChildDrawingOrderCallback(androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback?);
+    method public void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
+    method public void setItemViewCacheSize(int);
+    method @Deprecated public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(androidx.recyclerview.widget.RecyclerView.LayoutManager?);
+    method @Deprecated public void setLayoutTransition(android.animation.LayoutTransition!);
+    method public void setOnFlingListener(androidx.recyclerview.widget.RecyclerView.OnFlingListener?);
+    method @Deprecated public void setOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener?);
+    method public void setPreserveFocusAfterLayout(boolean);
+    method public void setRecycledViewPool(androidx.recyclerview.widget.RecyclerView.RecycledViewPool?);
+    method public void setRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener?);
+    method public void setScrollingTouchSlop(int);
+    method public void setViewCacheExtension(androidx.recyclerview.widget.RecyclerView.ViewCacheExtension?);
+    method public void smoothScrollBy(@Px int, @Px int);
+    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?);
+    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+    method public void stopScroll();
+    method public final void suppressLayout(boolean);
+    method public void swapAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public abstract static class RecyclerView.Adapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final boolean hasObservers();
+    method public final boolean hasStableIds();
+    method public final void notifyDataSetChanged();
+    method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, Object?);
+    method public final void notifyItemInserted(int);
+    method public final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, Object?);
+    method public final void notifyItemRangeInserted(int, int);
+    method public final void notifyItemRangeRemoved(int, int);
+    method public final void notifyItemRemoved(int);
+    method public void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object!>);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public boolean onFailedToRecycleView(VH);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void unregisterAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public abstract static class RecyclerView.AdapterDataObserver {
+    ctor public RecyclerView.AdapterDataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, Object?);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeMoved(int, int, int);
+    method public void onItemRangeRemoved(int, int);
+  }
+
+  public static interface RecyclerView.ChildDrawingOrderCallback {
+    method public int onGetChildDrawingOrder(int, int);
+  }
+
+  public static class RecyclerView.EdgeEffectFactory {
+    ctor public RecyclerView.EdgeEffectFactory();
+    method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int);
+    field public static final int DIRECTION_BOTTOM = 3; // 0x3
+    field public static final int DIRECTION_LEFT = 0; // 0x0
+    field public static final int DIRECTION_RIGHT = 2; // 0x2
+    field public static final int DIRECTION_TOP = 1; // 0x1
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_LEFT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_TOP, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_RIGHT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_BOTTOM}) public static @interface RecyclerView.EdgeEffectFactory.EdgeDirection {
+  }
+
+  public abstract static class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object!>);
+    method public final void dispatchAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener?);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int, java.util.List<java.lang.Object!>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  @IntDef(flag=true, value={androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_CHANGED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_REMOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_MOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_INVALIDATED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_APPEARED_IN_PRE_LAYOUT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.ItemAnimator.AdapterChanges {
+  }
+
+  public static interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int);
+    field public int bottom;
+    field @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public abstract static class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method @Deprecated public void getItemOffsets(android.graphics.Rect, int, androidx.recyclerview.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+  }
+
+  public abstract static class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View!);
+    method public void addDisappearingView(android.view.View!, int);
+    method public void addView(android.view.View!);
+    method public void addView(android.view.View!, int);
+    method public void assertInLayoutOrScroll(String!);
+    method public void assertNotInLayoutOrScroll(String!);
+    method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View!);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public android.view.View? findViewByPosition(int);
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View? getChildAt(int);
+    method public int getChildCount();
+    method @Deprecated public static int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View? getFocusedChild();
+    method @Px public int getHeight();
+    method public int getHeightMode();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method @Px public int getMinimumHeight();
+    method @Px public int getMinimumWidth();
+    method @Px public int getPaddingBottom();
+    method @Px public int getPaddingEnd();
+    method @Px public int getPaddingLeft();
+    method @Px public int getPaddingRight();
+    method @Px public int getPaddingStart();
+    method @Px public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static androidx.recyclerview.widget.RecyclerView.LayoutManager.Properties! getProperties(android.content.Context, android.util.AttributeSet?, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method @Px public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onAdapterChanged(androidx.recyclerview.widget.RecyclerView.Adapter?, androidx.recyclerview.widget.RecyclerView.Adapter?);
+    method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
+    method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
+    method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View? onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsChanged(androidx.recyclerview.widget.RecyclerView);
+    method public void onItemsMoved(androidx.recyclerview.widget.RecyclerView, int, int, int);
+    method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
+    method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
+    method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable? onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
+    method public boolean performAccessibilityActionForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, int, android.os.Bundle?);
+    method public void postOnAnimation(Runnable!);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(Runnable!);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View!);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method @Deprecated public void setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect!, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
+    method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public void addPosition(int, int);
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public RecyclerView.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method @Deprecated public int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static interface RecyclerView.OnChildAttachStateChangeListener {
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public abstract static class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  public static interface RecyclerView.OnItemTouchListener {
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView, int);
+    method public void onScrolled(androidx.recyclerview.widget.RecyclerView, int, int);
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? getRecycledView(int);
+    method public int getRecycledViewCount(int);
+    method public void putRecycledView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static interface RecyclerView.RecyclerListener {
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements androidx.recyclerview.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.view.View! findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getTargetPosition();
+    method @Deprecated public void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View!);
+    method protected abstract void onSeekTargetStep(@Px int, @Px int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    method public int getDuration();
+    method @Px public int getDx();
+    method @Px public int getDy();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public void jumpTo(int);
+    method public void setDuration(int);
+    method public void setDx(@Px int);
+    method public void setDy(@Px int);
+    method public void setInterpolator(android.view.animation.Interpolator?);
+    method public void update(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T! get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    method public boolean isPreLayout();
+    method public void put(int, Object!);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public abstract static class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View? getViewForPositionAndType(androidx.recyclerview.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public abstract static class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method @Deprecated public final int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
+    method public androidx.core.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public abstract class SnapHelper extends androidx.recyclerview.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
+    method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[]! calculateScrollDistance(int, int);
+    method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class SortedList<T> {
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>);
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>, int);
+    method public int add(T!);
+    method public void addAll(T![], boolean);
+    method public void addAll(T!...);
+    method public void addAll(java.util.Collection<T!>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T! get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T!);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T!);
+    method public T! removeItemAt(int);
+    method public void replaceAll(T![], boolean);
+    method public void replaceAll(T!...);
+    method public void replaceAll(java.util.Collection<T!>);
+    method public int size();
+    method public void updateItemAt(int, T!);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
+    method public boolean areContentsTheSame(T2!, T2!);
+    method public boolean areItemsTheSame(T2!, T2!);
+    method public int compare(T2!, T2!);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract static class SortedList.Callback<T2> implements java.util.Comparator<T2> androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2!, T2!);
+    method public abstract boolean areItemsTheSame(T2!, T2!);
+    method public abstract int compare(T2!, T2!);
+    method public Object? getChangePayload(T2!, T2!);
+    method public abstract void onChanged(int, int);
+    method public void onChanged(int, int, Object!);
+  }
+
+  public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter!);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int[]! findFirstCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findFirstVisibleItemPositions(int[]!);
+    method public int[]! findLastCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findLastVisibleItemPositions(int[]!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field @Deprecated public static final int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+}
+
diff --git a/recyclerview/recyclerview/api/res-1.1.0-beta04.txt b/recyclerview/recyclerview/api/res-1.1.0-beta04.txt
new file mode 100644
index 0000000..475bfc43
--- /dev/null
+++ b/recyclerview/recyclerview/api/res-1.1.0-beta04.txt
@@ -0,0 +1,9 @@
+attr fastScrollEnabled
+attr fastScrollHorizontalThumbDrawable
+attr fastScrollHorizontalTrackDrawable
+attr fastScrollVerticalThumbDrawable
+attr fastScrollVerticalTrackDrawable
+attr layoutManager
+attr reverseLayout
+attr spanCount
+attr stackFromEnd
diff --git a/recyclerview/recyclerview/api/restricted_1.1.0-beta04.txt b/recyclerview/recyclerview/api/restricted_1.1.0-beta04.txt
new file mode 100644
index 0000000..0690168
--- /dev/null
+++ b/recyclerview/recyclerview/api/restricted_1.1.0-beta04.txt
@@ -0,0 +1,1043 @@
+// Signature format: 3.0
+package androidx.recyclerview.widget {
+
+  public final class AdapterListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public AdapterListUpdateCallback(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public final class AsyncDifferConfig<T> {
+    method public java.util.concurrent.Executor getBackgroundThreadExecutor();
+    method public androidx.recyclerview.widget.DiffUtil.ItemCallback<T!> getDiffCallback();
+  }
+
+  public static final class AsyncDifferConfig.Builder<T> {
+    ctor public AsyncDifferConfig.Builder(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    method public androidx.recyclerview.widget.AsyncDifferConfig<T!> build();
+    method public androidx.recyclerview.widget.AsyncDifferConfig.Builder<T!> setBackgroundThreadExecutor(java.util.concurrent.Executor!);
+  }
+
+  public class AsyncListDiffer<T> {
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor public AsyncListDiffer(androidx.recyclerview.widget.ListUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public void addListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method public void removeListListener(androidx.recyclerview.widget.AsyncListDiffer.ListListener<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public static interface AsyncListDiffer.ListListener<T> {
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+  }
+
+  public class AsyncListUtil<T> {
+    ctor public AsyncListUtil(Class<T!>, int, androidx.recyclerview.widget.AsyncListUtil.DataCallback<T!>, androidx.recyclerview.widget.AsyncListUtil.ViewCallback);
+    method public T? getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public abstract static class AsyncListUtil.DataCallback<T> {
+    ctor public AsyncListUtil.DataCallback();
+    method @WorkerThread public abstract void fillData(T![], int, int);
+    method @WorkerThread public int getMaxCachedTiles();
+    method @WorkerThread public void recycleData(T![], int);
+    method @WorkerThread public abstract int refreshData();
+  }
+
+  public abstract static class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method @UiThread public void extendRangeInto(int[], int[], int);
+    method @UiThread public abstract void getItemRangeInto(int[]);
+    method @UiThread public abstract void onDataRefresh();
+    method @UiThread public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class BatchingListUpdateCallback implements androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public BatchingListUpdateCallback(androidx.recyclerview.widget.ListUpdateCallback);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int, Object!);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class DefaultItemAnimator extends androidx.recyclerview.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class DiffUtil {
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback);
+    method public static androidx.recyclerview.widget.DiffUtil.DiffResult calculateDiff(androidx.recyclerview.widget.DiffUtil.Callback, boolean);
+  }
+
+  public abstract static class DiffUtil.Callback {
+    ctor public DiffUtil.Callback();
+    method public abstract boolean areContentsTheSame(int, int);
+    method public abstract boolean areItemsTheSame(int, int);
+    method public Object? getChangePayload(int, int);
+    method public abstract int getNewListSize();
+    method public abstract int getOldListSize();
+  }
+
+  public static class DiffUtil.DiffResult {
+    method public int convertNewPositionToOld(@IntRange(from=0) int);
+    method public int convertOldPositionToNew(@IntRange(from=0) int);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.RecyclerView.Adapter);
+    method public void dispatchUpdatesTo(androidx.recyclerview.widget.ListUpdateCallback);
+    field public static final int NO_POSITION = -1; // 0xffffffff
+  }
+
+  public abstract static class DiffUtil.ItemCallback<T> {
+    ctor public DiffUtil.ItemCallback();
+    method public abstract boolean areContentsTheSame(T, T);
+    method public abstract boolean areItemsTheSame(T, T);
+    method public Object? getChangePayload(T, T);
+  }
+
+  public class DividerItemDecoration extends androidx.recyclerview.widget.RecyclerView.ItemDecoration {
+    ctor public DividerItemDecoration(android.content.Context!, int);
+    method public android.graphics.drawable.Drawable? getDrawable();
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setOrientation(int);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public class GridLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public GridLayoutManager(android.content.Context!, int);
+    ctor public GridLayoutManager(android.content.Context!, int, @androidx.recyclerview.widget.RecyclerView.Orientation int, boolean);
+    method public int getSpanCount();
+    method public androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup! getSpanSizeLookup();
+    method public boolean isUsingSpansToEstimateScrollbarDimensions();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup!);
+    method public void setUsingSpansToEstimateScrollbarDimensions(boolean);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public GridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public abstract static class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanGroupIndexCache();
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanGroupIndexCacheEnabled();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanGroupIndexCacheEnabled(boolean);
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class ItemTouchHelper extends androidx.recyclerview.widget.RecyclerView.ItemDecoration implements androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(androidx.recyclerview.widget.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public abstract static class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! chooseDropTarget(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!>, int, int);
+    method public void clearView(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(androidx.recyclerview.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static androidx.recyclerview.widget.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
+    method public float getSwipeThreshold(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
+    method public int interpolateOutOfBoundsScroll(androidx.recyclerview.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder!, float, float, int, boolean);
+    method public abstract boolean onMove(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onMoved(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, androidx.recyclerview.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(androidx.recyclerview.widget.RecyclerView.ViewHolder?, int);
+    method public abstract void onSwiped(androidx.recyclerview.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public abstract static class ItemTouchHelper.SimpleCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static interface ItemTouchHelper.ViewDropHandler {
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public interface ItemTouchUIUtil {
+    method public void clearView(android.view.View!);
+    method public void onDraw(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onDrawOver(android.graphics.Canvas!, androidx.recyclerview.widget.RecyclerView!, android.view.View!, float, float, int, boolean);
+    method public void onSelected(android.view.View!);
+  }
+
+  public class LinearLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public LinearLayoutManager(android.content.Context!);
+    ctor public LinearLayoutManager(android.content.Context!, @androidx.recyclerview.widget.RecyclerView.Orientation int, boolean);
+    ctor public LinearLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    method protected void calculateExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State, int[]);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method @Deprecated protected int getExtraLayoutSpace(androidx.recyclerview.widget.RecyclerView.State!);
+    method public int getInitialPrefetchItemCount();
+    method @androidx.recyclerview.widget.RecyclerView.Orientation public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void prepareForDrop(android.view.View, android.view.View, int, int);
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setInitialPrefetchItemCount(int);
+    method public void setOrientation(@androidx.recyclerview.widget.RecyclerView.Orientation int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+
+  public class LinearSmoothScroller extends androidx.recyclerview.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context!);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View!, int);
+    method public int calculateDyToMakeVisible(android.view.View!, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics!);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View!, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    method protected void updateActionForInterimTarget(androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action!);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator! mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator! mLinearInterpolator;
+    field protected android.graphics.PointF! mTargetVector;
+  }
+
+  public class LinearSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public LinearSnapHelper();
+    method public int[]! calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public android.view.View! findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public abstract class ListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+    ctor protected ListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T!>);
+    ctor protected ListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T!>);
+    method public java.util.List<T!> getCurrentList();
+    method protected T! getItem(int);
+    method public int getItemCount();
+    method public void onCurrentListChanged(java.util.List<T!>, java.util.List<T!>);
+    method public void submitList(java.util.List<T!>?);
+    method public void submitList(java.util.List<T!>?, Runnable?);
+  }
+
+  public interface ListUpdateCallback {
+    method public void onChanged(int, int, Object?);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract class OrientationHelper {
+    method public static androidx.recyclerview.widget.OrientationHelper! createHorizontalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public static androidx.recyclerview.widget.OrientationHelper! createOrientationHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!, @androidx.recyclerview.widget.RecyclerView.Orientation int);
+    method public static androidx.recyclerview.widget.OrientationHelper! createVerticalHelper(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int getDecoratedEnd(android.view.View!);
+    method public abstract int getDecoratedMeasurement(android.view.View!);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View!);
+    method public abstract int getDecoratedStart(android.view.View!);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager! getLayoutManager();
+    method public abstract int getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View!);
+    method public abstract int getTransformedStartWithDecoration(android.view.View!);
+    method public abstract void offsetChild(android.view.View!, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final androidx.recyclerview.widget.RecyclerView.LayoutManager! mLayoutManager;
+  }
+
+  public class PagerSnapHelper extends androidx.recyclerview.widget.SnapHelper {
+    ctor public PagerSnapHelper();
+    method public int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method protected androidx.recyclerview.widget.LinearSmoothScroller! createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+  }
+
+  public class RecyclerView extends android.view.ViewGroup implements androidx.core.view.NestedScrollingChild2 androidx.core.view.NestedScrollingChild3 androidx.core.view.ScrollingView {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet?, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+    method public final void dispatchNestedScroll(int, int, int, int, int[]!, int, int[]);
+    method public boolean drawChild(android.graphics.Canvas!, android.view.View!, long);
+    method public android.view.View? findChildViewUnder(float, float);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findContainingViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForAdapterPosition(int);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! findViewHolderForItemId(long);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForLayoutPosition(int);
+    method @Deprecated public androidx.recyclerview.widget.RecyclerView.ViewHolder? findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public androidx.recyclerview.widget.RecyclerView.Adapter? getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method @Deprecated public int getChildPosition(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder! getChildViewHolder(android.view.View);
+    method public androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate? getCompatAccessibilityDelegate();
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory getEdgeEffectFactory();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator? getItemAnimator();
+    method public androidx.recyclerview.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+    method public int getItemDecorationCount();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public androidx.recyclerview.widget.RecyclerView.OnFlingListener? getOnFlingListener();
+    method public boolean getPreserveFocusAfterLayout();
+    method public androidx.recyclerview.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasNestedScrollingParent(int);
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method @Deprecated public boolean isLayoutFrozen();
+    method public final boolean isLayoutSuppressed();
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas!);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(@Px int, @Px int);
+    method public void removeItemDecoration(androidx.recyclerview.widget.RecyclerView.ItemDecoration);
+    method public void removeItemDecorationAt(int);
+    method public void removeOnChildAttachStateChangeListener(androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(androidx.recyclerview.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener);
+    method public void scrollToPosition(int);
+    method public void setAccessibilityDelegateCompat(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate?);
+    method public void setAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?);
+    method public void setChildDrawingOrderCallback(androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback?);
+    method public void setEdgeEffectFactory(androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(androidx.recyclerview.widget.RecyclerView.ItemAnimator?);
+    method public void setItemViewCacheSize(int);
+    method @Deprecated public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(androidx.recyclerview.widget.RecyclerView.LayoutManager?);
+    method @Deprecated public void setLayoutTransition(android.animation.LayoutTransition!);
+    method public void setOnFlingListener(androidx.recyclerview.widget.RecyclerView.OnFlingListener?);
+    method @Deprecated public void setOnScrollListener(androidx.recyclerview.widget.RecyclerView.OnScrollListener?);
+    method public void setPreserveFocusAfterLayout(boolean);
+    method public void setRecycledViewPool(androidx.recyclerview.widget.RecyclerView.RecycledViewPool?);
+    method public void setRecyclerListener(androidx.recyclerview.widget.RecyclerView.RecyclerListener?);
+    method public void setScrollingTouchSlop(int);
+    method public void setViewCacheExtension(androidx.recyclerview.widget.RecyclerView.ViewCacheExtension?);
+    method public void smoothScrollBy(@Px int, @Px int);
+    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?);
+    method public void smoothScrollBy(@Px int, @Px int, android.view.animation.Interpolator?, int);
+    method public void smoothScrollToPosition(int);
+    method public boolean startNestedScroll(int, int);
+    method public void stopNestedScroll(int);
+    method public void stopScroll();
+    method public final void suppressLayout(boolean);
+    method public void swapAdapter(androidx.recyclerview.widget.RecyclerView.Adapter?, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public abstract static class RecyclerView.Adapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final boolean hasObservers();
+    method public final boolean hasStableIds();
+    method public final void notifyDataSetChanged();
+    method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, Object?);
+    method public final void notifyItemInserted(int);
+    method public final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, Object?);
+    method public final void notifyItemRangeInserted(int, int);
+    method public final void notifyItemRangeRemoved(int, int);
+    method public final void notifyItemRemoved(int);
+    method public void onAttachedToRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object!>);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDetachedFromRecyclerView(androidx.recyclerview.widget.RecyclerView);
+    method public boolean onFailedToRecycleView(VH);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void unregisterAdapterDataObserver(androidx.recyclerview.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public abstract static class RecyclerView.AdapterDataObserver {
+    ctor public RecyclerView.AdapterDataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, Object?);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeMoved(int, int, int);
+    method public void onItemRangeRemoved(int, int);
+  }
+
+  public static interface RecyclerView.ChildDrawingOrderCallback {
+    method public int onGetChildDrawingOrder(int, int);
+  }
+
+  public static class RecyclerView.EdgeEffectFactory {
+    ctor public RecyclerView.EdgeEffectFactory();
+    method protected android.widget.EdgeEffect createEdgeEffect(androidx.recyclerview.widget.RecyclerView, @androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection int);
+    field public static final int DIRECTION_BOTTOM = 3; // 0x3
+    field public static final int DIRECTION_LEFT = 0; // 0x0
+    field public static final int DIRECTION_RIGHT = 2; // 0x2
+    field public static final int DIRECTION_TOP = 1; // 0x1
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_LEFT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_TOP, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_RIGHT, androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.DIRECTION_BOTTOM}) public static @interface RecyclerView.EdgeEffectFactory.EdgeDirection {
+  }
+
+  public abstract static class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public boolean canReuseUpdatedViewHolder(androidx.recyclerview.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object!>);
+    method public final void dispatchAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener?);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int, java.util.List<java.lang.Object!>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  @IntDef(flag=true, value={androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_CHANGED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_REMOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_MOVED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_INVALIDATED, androidx.recyclerview.widget.RecyclerView.ItemAnimator.FLAG_APPEARED_IN_PRE_LAYOUT}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.ItemAnimator.AdapterChanges {
+  }
+
+  public static interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+    method public androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(androidx.recyclerview.widget.RecyclerView.ViewHolder, @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges int);
+    field public int bottom;
+    field @androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public abstract static class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method @Deprecated public void getItemOffsets(android.graphics.Rect, int, androidx.recyclerview.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDraw(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State);
+    method @Deprecated public void onDrawOver(android.graphics.Canvas, androidx.recyclerview.widget.RecyclerView);
+  }
+
+  public abstract static class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View!);
+    method public void addDisappearingView(android.view.View!, int);
+    method public void addView(android.view.View!);
+    method public void addView(android.view.View!, int);
+    method public void assertInLayoutOrScroll(String!);
+    method public void assertNotInLayoutOrScroll(String!);
+    method public void attachView(android.view.View, int, androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public static int chooseSize(int, int, int);
+    method public void collectAdjacentPrefetchPositions(int, int, androidx.recyclerview.widget.RecyclerView.State!, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public void collectInitialPrefetchPositions(int, androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry!);
+    method public int computeHorizontalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(androidx.recyclerview.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(androidx.recyclerview.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View!);
+    method public android.view.View? findContainingItemView(android.view.View);
+    method public android.view.View? findViewByPosition(int);
+    method public abstract androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateLayoutParams(android.content.Context!, android.util.AttributeSet!);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View? getChildAt(int);
+    method public int getChildCount();
+    method @Deprecated public static int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View? getFocusedChild();
+    method @Px public int getHeight();
+    method public int getHeightMode();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method @Px public int getMinimumHeight();
+    method @Px public int getMinimumWidth();
+    method @Px public int getPaddingBottom();
+    method @Px public int getPaddingEnd();
+    method @Px public int getPaddingLeft();
+    method @Px public int getPaddingRight();
+    method @Px public int getPaddingStart();
+    method @Px public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static androidx.recyclerview.widget.RecyclerView.LayoutManager.Properties! getProperties(android.content.Context, android.util.AttributeSet?, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method @Px public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public final boolean isItemPrefetchEnabled();
+    method public boolean isLayoutHierarchical(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public boolean isViewPartiallyVisible(android.view.View, boolean, boolean);
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(@Px int);
+    method public void offsetChildrenVertical(@Px int);
+    method public void onAdapterChanged(androidx.recyclerview.widget.RecyclerView.Adapter?, androidx.recyclerview.widget.RecyclerView.Adapter?);
+    method public boolean onAddFocusables(androidx.recyclerview.widget.RecyclerView, java.util.ArrayList<android.view.View!>, int, int);
+    method @CallSuper public void onAttachedToWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @Deprecated public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!);
+    method @CallSuper public void onDetachedFromWindow(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.Recycler!);
+    method public android.view.View? onFocusSearchFailed(android.view.View, int, androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View? onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsChanged(androidx.recyclerview.widget.RecyclerView);
+    method public void onItemsMoved(androidx.recyclerview.widget.RecyclerView, int, int, int);
+    method public void onItemsRemoved(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(androidx.recyclerview.widget.RecyclerView, int, int, Object?);
+    method public void onLayoutChildren(androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onLayoutCompleted(androidx.recyclerview.widget.RecyclerView.State!);
+    method public void onMeasure(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, int);
+    method @Deprecated public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, android.view.View, android.view.View?);
+    method public boolean onRequestChildFocus(androidx.recyclerview.widget.RecyclerView, androidx.recyclerview.widget.RecyclerView.State, android.view.View, android.view.View?);
+    method public void onRestoreInstanceState(android.os.Parcelable!);
+    method public android.os.Parcelable? onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, int, android.os.Bundle?);
+    method public boolean performAccessibilityActionForItem(androidx.recyclerview.widget.RecyclerView.Recycler, androidx.recyclerview.widget.RecyclerView.State, android.view.View, int, android.os.Bundle?);
+    method public void postOnAnimation(Runnable!);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, androidx.recyclerview.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(Runnable!);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View!);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public boolean requestChildRectangleOnScreen(androidx.recyclerview.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, androidx.recyclerview.widget.RecyclerView.Recycler!, androidx.recyclerview.widget.RecyclerView.State!);
+    method @Deprecated public void setAutoMeasureEnabled(boolean);
+    method public final void setItemPrefetchEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect!, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    method public void smoothScrollToPosition(androidx.recyclerview.widget.RecyclerView!, androidx.recyclerview.widget.RecyclerView.State!, int);
+    method public void startSmoothScroll(androidx.recyclerview.widget.RecyclerView.SmoothScroller!);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static interface RecyclerView.LayoutManager.LayoutPrefetchRegistry {
+    method public void addPosition(int, int);
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public RecyclerView.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method @Deprecated public int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static interface RecyclerView.OnChildAttachStateChangeListener {
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public abstract static class RecyclerView.OnFlingListener {
+    ctor public RecyclerView.OnFlingListener();
+    method public abstract boolean onFling(int, int);
+  }
+
+  public static interface RecyclerView.OnItemTouchListener {
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(androidx.recyclerview.widget.RecyclerView, int);
+    method public void onScrolled(androidx.recyclerview.widget.RecyclerView, int, int);
+  }
+
+  @IntDef({androidx.recyclerview.widget.RecyclerView.HORIZONTAL, androidx.recyclerview.widget.RecyclerView.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RecyclerView.Orientation {
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public androidx.recyclerview.widget.RecyclerView.ViewHolder? getRecycledView(int);
+    method public int getRecycledViewCount(int);
+    method public void putRecycledView(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<androidx.recyclerview.widget.RecyclerView.ViewHolder!> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static interface RecyclerView.RecyclerListener {
+    method public void onViewRecycled(androidx.recyclerview.widget.RecyclerView.ViewHolder);
+  }
+
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements androidx.recyclerview.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(androidx.recyclerview.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public abstract static class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+    method public android.view.View! findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutManager? getLayoutManager();
+    method public int getTargetPosition();
+    method @Deprecated public void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View!);
+    method protected abstract void onSeekTargetStep(@Px int, @Px int, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, androidx.recyclerview.widget.RecyclerView.State, androidx.recyclerview.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int);
+    ctor public RecyclerView.SmoothScroller.Action(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    method public int getDuration();
+    method @Px public int getDx();
+    method @Px public int getDy();
+    method public android.view.animation.Interpolator? getInterpolator();
+    method public void jumpTo(int);
+    method public void setDuration(int);
+    method public void setDx(@Px int);
+    method public void setDy(@Px int);
+    method public void setInterpolator(android.view.animation.Interpolator?);
+    method public void update(@Px int, @Px int, int, android.view.animation.Interpolator?);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static interface RecyclerView.SmoothScroller.ScrollVectorProvider {
+    method public android.graphics.PointF? computeScrollVectorForPosition(int);
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public <T> T! get(int);
+    method public int getItemCount();
+    method public int getRemainingScrollHorizontal();
+    method public int getRemainingScrollVertical();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    method public boolean isPreLayout();
+    method public void put(int, Object!);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public abstract static class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View? getViewForPositionAndType(androidx.recyclerview.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public abstract static class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method @Deprecated public final int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(androidx.recyclerview.widget.RecyclerView);
+    method public androidx.core.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public static class RecyclerViewAccessibilityDelegate.ItemDelegate extends androidx.core.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate.ItemDelegate(androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate);
+  }
+
+  public abstract class SimpleItemAnimator extends androidx.recyclerview.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean animateAppearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(androidx.recyclerview.widget.RecyclerView.ViewHolder!, androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animateDisappearance(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo?);
+    method public abstract boolean animateMove(androidx.recyclerview.widget.RecyclerView.ViewHolder!, int, int, int, int);
+    method public boolean animatePersistence(androidx.recyclerview.widget.RecyclerView.ViewHolder, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo, androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public final void dispatchMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public final void dispatchRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onAddStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onChangeFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onChangeStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!, boolean);
+    method public void onMoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onMoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveFinished(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void onRemoveStarting(androidx.recyclerview.widget.RecyclerView.ViewHolder!);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public abstract class SnapHelper extends androidx.recyclerview.widget.RecyclerView.OnFlingListener {
+    ctor public SnapHelper();
+    method public void attachToRecyclerView(androidx.recyclerview.widget.RecyclerView?) throws java.lang.IllegalStateException;
+    method public abstract int[]? calculateDistanceToFinalSnap(androidx.recyclerview.widget.RecyclerView.LayoutManager, android.view.View);
+    method public int[]! calculateScrollDistance(int, int);
+    method protected androidx.recyclerview.widget.RecyclerView.SmoothScroller? createScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method @Deprecated protected androidx.recyclerview.widget.LinearSmoothScroller? createSnapScroller(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract android.view.View? findSnapView(androidx.recyclerview.widget.RecyclerView.LayoutManager!);
+    method public abstract int findTargetSnapPosition(androidx.recyclerview.widget.RecyclerView.LayoutManager!, int, int);
+    method public boolean onFling(int, int);
+  }
+
+  public class SortedList<T> {
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>);
+    ctor public SortedList(Class<T!>, androidx.recyclerview.widget.SortedList.Callback<T!>, int);
+    method public int add(T!);
+    method public void addAll(T![], boolean);
+    method public void addAll(T!...);
+    method public void addAll(java.util.Collection<T!>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T! get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T!);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T!);
+    method public T! removeItemAt(int);
+    method public void replaceAll(T![], boolean);
+    method public void replaceAll(T!...);
+    method public void replaceAll(java.util.Collection<T!>);
+    method public int size();
+    method public void updateItemAt(int, T!);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedList.BatchedCallback(androidx.recyclerview.widget.SortedList.Callback<T2!>!);
+    method public boolean areContentsTheSame(T2!, T2!);
+    method public boolean areItemsTheSame(T2!, T2!);
+    method public int compare(T2!, T2!);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public abstract static class SortedList.Callback<T2> implements java.util.Comparator<T2> androidx.recyclerview.widget.ListUpdateCallback {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2!, T2!);
+    method public abstract boolean areItemsTheSame(T2!, T2!);
+    method public abstract int compare(T2!, T2!);
+    method public Object? getChangePayload(T2!, T2!);
+    method public abstract void onChanged(int, int);
+    method public void onChanged(int, int, Object!);
+  }
+
+  public abstract class SortedListAdapterCallback<T2> extends androidx.recyclerview.widget.SortedList.Callback<T2> {
+    ctor public SortedListAdapterCallback(androidx.recyclerview.widget.RecyclerView.Adapter!);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public class StaggeredGridLayoutManager extends androidx.recyclerview.widget.RecyclerView.LayoutManager implements androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider {
+    ctor public StaggeredGridLayoutManager(android.content.Context!, android.util.AttributeSet!, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public android.graphics.PointF! computeScrollVectorForPosition(int);
+    method public int[]! findFirstCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findFirstVisibleItemPositions(int[]!);
+    method public int[]! findLastCompletelyVisibleItemPositions(int[]!);
+    method public int[]! findLastVisibleItemPositions(int[]!);
+    method public androidx.recyclerview.widget.RecyclerView.LayoutParams! generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field @Deprecated public static final int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends androidx.recyclerview.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams!);
+    ctor public StaggeredGridLayoutManager.LayoutParams(androidx.recyclerview.widget.RecyclerView.LayoutParams!);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+
+}
+
diff --git a/recyclerview/recyclerview/build.gradle b/recyclerview/recyclerview/build.gradle
index 16d7734..4ec3faf 100644
--- a/recyclerview/recyclerview/build.gradle
+++ b/recyclerview/recyclerview/build.gradle
@@ -11,7 +11,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc02")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
     api("androidx.customview:customview:1.0.0")
 
diff --git a/room/common/api/2.2.0-beta01.ignore b/room/common/api/2.2.0-beta01.ignore
new file mode 100644
index 0000000..51b51d5
--- /dev/null
+++ b/room/common/api/2.2.0-beta01.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+ChangedType: androidx.room.Database#entities():
+    Method androidx.room.Database.entities has changed return type from Class[] to Class<?>[]
+ChangedType: androidx.room.Database#views():
+    Method androidx.room.Database.views has changed return type from Class[] to Class<?>[]
+ChangedType: androidx.room.ForeignKey#entity():
+    Method androidx.room.ForeignKey.entity has changed return type from Class to Class<?>
+ChangedType: androidx.room.Fts4#contentEntity():
+    Method androidx.room.Fts4.contentEntity has changed return type from Class to Class<?>
+ChangedType: androidx.room.RawQuery#observedEntities():
+    Method androidx.room.RawQuery.observedEntities has changed return type from Class[] to Class<?>[]
+ChangedType: androidx.room.Relation#entity():
+    Method androidx.room.Relation.entity has changed return type from Class to Class<?>
diff --git a/room/common/api/2.2.0-beta01.txt b/room/common/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..238967d
--- /dev/null
+++ b/room/common/api/2.2.0-beta01.txt
@@ -0,0 +1,197 @@
+// Signature format: 3.0
+package androidx.room {
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ColumnInfo {
+    method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
+    method public abstract boolean index() default false;
+    method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
+    method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.SQLiteTypeAffinity {
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Dao {
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Database {
+    method public abstract Class<?>[] entities();
+    method public abstract boolean exportSchema() default true;
+    method public abstract int version();
+    method public abstract Class<?>[] views() default {};
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface DatabaseView {
+    method public abstract String value() default "";
+    method public abstract String viewName() default "";
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Delete {
+    method public abstract Class<?> entity() default java.lang.Object.class;
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Embedded {
+    method public abstract String prefix() default "";
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Entity {
+    method public abstract androidx.room.ForeignKey[] foreignKeys() default {};
+    method public abstract String[] ignoredColumns() default {};
+    method public abstract androidx.room.Index[] indices() default {};
+    method public abstract boolean inheritSuperIndices() default false;
+    method public abstract String[] primaryKeys() default {};
+    method public abstract String tableName() default "";
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ForeignKey {
+    method public abstract String[] childColumns();
+    method public abstract boolean deferred() default false;
+    method public abstract Class<?> entity();
+    method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
+    method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
+    method public abstract String[] parentColumns();
+    field public static final int CASCADE = 5; // 0x5
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ForeignKey.Action {
+  }
+
+  @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts3 {
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs() default {};
+  }
+
+  @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts4 {
+    method public abstract Class<?> contentEntity() default java.lang.Object.class;
+    method public abstract String languageId() default "";
+    method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
+    method public abstract String[] notIndexed() default {};
+    method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
+    method public abstract int[] prefix() default {};
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs() default {};
+  }
+
+  public class FtsOptions {
+    field public static final String TOKENIZER_ICU = "icu";
+    field public static final String TOKENIZER_PORTER = "porter";
+    field public static final String TOKENIZER_SIMPLE = "simple";
+    field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
+  }
+
+  public enum FtsOptions.MatchInfo {
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
+  }
+
+  public enum FtsOptions.Order {
+    enum_constant public static final androidx.room.FtsOptions.Order ASC;
+    enum_constant public static final androidx.room.FtsOptions.Order DESC;
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.CONSTRUCTOR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Ignore {
+  }
+
+  @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Index {
+    method public abstract String name() default "";
+    method public abstract boolean unique() default false;
+    method public abstract String[] value();
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Insert {
+    method public abstract Class<?> entity() default java.lang.Object.class;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+  }
+
+  @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Junction {
+    method public abstract String entityColumn() default "";
+    method public abstract String parentColumn() default "";
+    method public abstract Class<?> value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @IntDef({androidx.room.OnConflictStrategy.REPLACE, androidx.room.OnConflictStrategy.ROLLBACK, androidx.room.OnConflictStrategy.ABORT, androidx.room.OnConflictStrategy.FAIL, androidx.room.OnConflictStrategy.IGNORE}) public @interface OnConflictStrategy {
+    field public static final int ABORT = 3; // 0x3
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface PrimaryKey {
+    method public abstract boolean autoGenerate() default false;
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Query {
+    method public abstract String value();
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface RawQuery {
+    method public abstract Class<?>[] observedEntities() default {};
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Relation {
+    method public abstract androidx.room.Junction associateBy() default @androidx.room.Junction;
+    method public abstract Class<?> entity() default java.lang.Object.class;
+    method public abstract String entityColumn();
+    method public abstract String parentColumn();
+    method public abstract String[] projection() default {};
+  }
+
+  public class RoomWarnings {
+    ctor @Deprecated public RoomWarnings();
+    field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
+    field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
+    field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+    field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
+    field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+    field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
+    field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
+    field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
+    field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
+    field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface SkipQueryVerification {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Transaction {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverter {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverters {
+    method public abstract Class<?>[] value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Update {
+    method public abstract Class<?> entity() default java.lang.Object.class;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+  }
+
+}
+
diff --git a/room/common/api/restricted_2.2.0-beta01.txt b/room/common/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..ed6c4ee
--- /dev/null
+++ b/room/common/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,206 @@
+// Signature format: 3.0
+package androidx.room {
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ColumnInfo {
+    method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
+    method public abstract boolean index() default false;
+    method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
+    method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.SQLiteTypeAffinity {
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Dao {
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Database {
+    method public abstract Class<?>[] entities();
+    method public abstract boolean exportSchema() default true;
+    method public abstract int version();
+    method public abstract Class<?>[] views() default {};
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface DatabaseView {
+    method public abstract String value() default "";
+    method public abstract String viewName() default "";
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Delete {
+    method public abstract Class<?> entity() default java.lang.Object.class;
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Embedded {
+    method public abstract String prefix() default "";
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Entity {
+    method public abstract androidx.room.ForeignKey[] foreignKeys() default {};
+    method public abstract String[] ignoredColumns() default {};
+    method public abstract androidx.room.Index[] indices() default {};
+    method public abstract boolean inheritSuperIndices() default false;
+    method public abstract String[] primaryKeys() default {};
+    method public abstract String tableName() default "";
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ForeignKey {
+    method public abstract String[] childColumns();
+    method public abstract boolean deferred() default false;
+    method public abstract Class<?> entity();
+    method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
+    method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
+    method public abstract String[] parentColumns();
+    field public static final int CASCADE = 5; // 0x5
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ForeignKey.Action {
+  }
+
+  @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts3 {
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs() default {};
+  }
+
+  @RequiresApi(16) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE) public @interface Fts4 {
+    method public abstract Class<?> contentEntity() default java.lang.Object.class;
+    method public abstract String languageId() default "";
+    method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
+    method public abstract String[] notIndexed() default {};
+    method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
+    method public abstract int[] prefix() default {};
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs() default {};
+  }
+
+  public class FtsOptions {
+    field public static final String TOKENIZER_ICU = "icu";
+    field public static final String TOKENIZER_PORTER = "porter";
+    field public static final String TOKENIZER_SIMPLE = "simple";
+    field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
+  }
+
+  public enum FtsOptions.MatchInfo {
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
+  }
+
+  public enum FtsOptions.Order {
+    enum_constant public static final androidx.room.FtsOptions.Order ASC;
+    enum_constant public static final androidx.room.FtsOptions.Order DESC;
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.CONSTRUCTOR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Ignore {
+  }
+
+  @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Index {
+    method public abstract String name() default "";
+    method public abstract boolean unique() default false;
+    method public abstract String[] value();
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Insert {
+    method public abstract Class<?> entity() default java.lang.Object.class;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+  }
+
+  @java.lang.annotation.Target({}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Junction {
+    method public abstract String entityColumn() default "";
+    method public abstract String parentColumn() default "";
+    method public abstract Class<?> value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @IntDef({androidx.room.OnConflictStrategy.REPLACE, androidx.room.OnConflictStrategy.ROLLBACK, androidx.room.OnConflictStrategy.ABORT, androidx.room.OnConflictStrategy.FAIL, androidx.room.OnConflictStrategy.IGNORE}) public @interface OnConflictStrategy {
+    field public static final int ABORT = 3; // 0x3
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface PrimaryKey {
+    method public abstract boolean autoGenerate() default false;
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Query {
+    method public abstract String value();
+  }
+
+  @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface RawQuery {
+    method public abstract Class<?>[] observedEntities() default {};
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Relation {
+    method public abstract androidx.room.Junction associateBy() default @androidx.room.Junction;
+    method public abstract Class<?> entity() default java.lang.Object.class;
+    method public abstract String entityColumn();
+    method public abstract String parentColumn();
+    method public abstract String[] projection() default {};
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomMasterTable {
+    method public static String! createInsertQuery(String!);
+    field public static final String CREATE_QUERY = "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)";
+    field public static final String DEFAULT_ID = "42";
+    field public static final String NAME = "room_master_table";
+    field public static final String READ_QUERY = "SELECT identity_hash FROM room_master_table WHERE id = 42 LIMIT 1";
+    field public static final String TABLE_NAME = "room_master_table";
+  }
+
+  public class RoomWarnings {
+    ctor @Deprecated public RoomWarnings();
+    field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
+    field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
+    field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+    field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
+    field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+    field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
+    field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
+    field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
+    field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
+    field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface SkipQueryVerification {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Transaction {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverter {
+  }
+
+  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface TypeConverters {
+    method public abstract Class<?>[] value();
+  }
+
+  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface Update {
+    method public abstract Class<?> entity() default java.lang.Object.class;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+  }
+
+}
+
diff --git a/room/guava/api/2.2.0-beta01.txt b/room/guava/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/room/guava/api/2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/guava/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/guava/api/res-2.2.0-beta01.txt
diff --git a/room/guava/api/restricted_2.2.0-beta01.txt b/room/guava/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..b39d410
--- /dev/null
+++ b/room/guava/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room.guava {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class GuavaRoom {
+    method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+    method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(androidx.room.RoomDatabase!, java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+    method public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(androidx.room.RoomDatabase!, boolean, java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+    method public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, boolean, java.util.concurrent.Callable<T!>, androidx.room.RoomSQLiteQuery, boolean, android.os.CancellationSignal?);
+    method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, java.util.concurrent.Callable<T!>);
+    method public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, boolean, java.util.concurrent.Callable<T!>);
+  }
+
+}
+
diff --git a/room/guava/build.gradle b/room/guava/build.gradle
index 4de80a2..a167763 100644
--- a/room/guava/build.gradle
+++ b/room/guava/build.gradle
@@ -33,7 +33,7 @@
     implementation(ARCH_CORE_RUNTIME)
 
     api(SUPPORT_ANNOTATIONS)
-    api(GUAVA_ANDROID)
+    implementation(GUAVA_ANDROID)
     androidTestImplementation(ANDROIDX_TEST_RUNNER)
     androidTestImplementation(TRUTH)
 }
diff --git a/room/ktx/api/2.2.0-beta01.txt b/room/ktx/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..cee69e3
--- /dev/null
+++ b/room/ktx/api/2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room {
+
+  public final class CoroutinesRoomKt {
+    ctor public CoroutinesRoomKt();
+  }
+
+  public final class RoomDatabaseKt {
+    ctor public RoomDatabaseKt();
+    method public static suspend <R> Object! withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/ktx/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/ktx/api/res-2.2.0-beta01.txt
diff --git a/room/ktx/api/restricted_2.2.0-beta01.txt b/room/ktx/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..20837edc
--- /dev/null
+++ b/room/ktx/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,25 @@
+// Signature format: 3.0
+package androidx.room {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class CoroutinesRoom {
+    method public static <R> kotlinx.coroutines.flow.Flow<R> createFlow(androidx.room.RoomDatabase db, boolean inTransaction, String![] tableNames, java.util.concurrent.Callable<R> callable);
+    method public static suspend <R> Object! execute(androidx.room.RoomDatabase p, boolean db, java.util.concurrent.Callable<R> inTransaction, kotlin.coroutines.Continuation<? super R> callable);
+    field public static final androidx.room.CoroutinesRoom.Companion! Companion;
+  }
+
+  public static final class CoroutinesRoom.Companion {
+    method public <R> kotlinx.coroutines.flow.Flow<R> createFlow(androidx.room.RoomDatabase db, boolean inTransaction, String![] tableNames, java.util.concurrent.Callable<R> callable);
+    method public suspend <R> Object! execute(androidx.room.RoomDatabase db, boolean inTransaction, java.util.concurrent.Callable<R> callable, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+  public final class CoroutinesRoomKt {
+    ctor public CoroutinesRoomKt();
+  }
+
+  public final class RoomDatabaseKt {
+    ctor public RoomDatabaseKt();
+    method public static suspend <R> Object! withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R> p);
+  }
+
+}
+
diff --git a/room/migration/api/2.2.0-beta01.txt b/room/migration/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/room/migration/api/2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/room/migration/api/restricted_2.2.0-beta01.txt b/room/migration/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..ae8f58d
--- /dev/null
+++ b/room/migration/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,107 @@
+// Signature format: 3.0
+package androidx.room.migration.bundle {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class BundleUtil {
+    field public static final String TABLE_NAME_PLACEHOLDER = "${TABLE_NAME}";
+    field public static final String VIEW_NAME_PLACEHOLDER = "${VIEW_NAME}";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseBundle {
+    ctor public DatabaseBundle(int, String!, java.util.List<androidx.room.migration.bundle.EntityBundle!>!, java.util.List<androidx.room.migration.bundle.DatabaseViewBundle!>!, java.util.List<java.lang.String!>!);
+    ctor public DatabaseBundle();
+    method public java.util.List<java.lang.String!>! buildCreateQueries();
+    method public java.util.List<androidx.room.migration.bundle.EntityBundle!>! getEntities();
+    method public java.util.Map<java.lang.String!,androidx.room.migration.bundle.EntityBundle!>! getEntitiesByTableName();
+    method public String! getIdentityHash();
+    method public int getVersion();
+    method public java.util.List<androidx.room.migration.bundle.DatabaseViewBundle!>! getViews();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseViewBundle {
+    ctor public DatabaseViewBundle(String!, String!);
+    method public String! createView();
+    method public String! getCreateSql();
+    method public String! getViewName();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseViewBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class EntityBundle {
+    ctor public EntityBundle(String!, String!, java.util.List<androidx.room.migration.bundle.FieldBundle!>!, androidx.room.migration.bundle.PrimaryKeyBundle!, java.util.List<androidx.room.migration.bundle.IndexBundle!>!, java.util.List<androidx.room.migration.bundle.ForeignKeyBundle!>!);
+    method public java.util.Collection<java.lang.String!>! buildCreateQueries();
+    method public String! createNewTable();
+    method public String! createTable();
+    method public String! getCreateSql();
+    method public java.util.List<androidx.room.migration.bundle.FieldBundle!>! getFields();
+    method public java.util.Map<java.lang.String!,androidx.room.migration.bundle.FieldBundle!>! getFieldsByColumnName();
+    method public java.util.List<androidx.room.migration.bundle.ForeignKeyBundle!>! getForeignKeys();
+    method public java.util.List<androidx.room.migration.bundle.IndexBundle!>! getIndices();
+    method public String! getNewTableName();
+    method public androidx.room.migration.bundle.PrimaryKeyBundle! getPrimaryKey();
+    method public String! getTableName();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.EntityBundle!);
+    method public String renameToOriginal();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle {
+    ctor @Deprecated public FieldBundle(String!, String!, String!, boolean);
+    ctor public FieldBundle(String!, String!, String!, boolean, String!);
+    method public String! getAffinity();
+    method public String! getColumnName();
+    method public String! getDefaultValue();
+    method public String! getFieldPath();
+    method public boolean isNonNull();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ForeignKeyBundle {
+    ctor public ForeignKeyBundle(String!, String!, String!, java.util.List<java.lang.String!>!, java.util.List<java.lang.String!>!);
+    method public java.util.List<java.lang.String!>! getColumns();
+    method public String! getOnDelete();
+    method public String! getOnUpdate();
+    method public java.util.List<java.lang.String!>! getReferencedColumns();
+    method public String! getTable();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.ForeignKeyBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsEntityBundle extends androidx.room.migration.bundle.EntityBundle {
+    ctor public FtsEntityBundle(String!, String!, java.util.List<androidx.room.migration.bundle.FieldBundle!>!, androidx.room.migration.bundle.PrimaryKeyBundle!, String!, androidx.room.migration.bundle.FtsOptionsBundle!, java.util.List<java.lang.String!>!);
+    method public androidx.room.migration.bundle.FtsOptionsBundle! getFtsOptions();
+    method public java.util.List<java.lang.String!>! getShadowTableNames();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsOptionsBundle {
+    ctor public FtsOptionsBundle(String!, java.util.List<java.lang.String!>!, String!, String!, String!, java.util.List<java.lang.String!>!, java.util.List<java.lang.Integer!>!, String!);
+    method public String! getContentTable();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.FtsOptionsBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class IndexBundle {
+    ctor public IndexBundle(String!, boolean, java.util.List<java.lang.String!>!, String!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! create(String!);
+    method public java.util.List<java.lang.String!>! getColumnNames();
+    method public String! getName();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.IndexBundle!);
+    method public boolean isUnique();
+    field public static final String DEFAULT_PREFIX = "index_";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PrimaryKeyBundle {
+    ctor public PrimaryKeyBundle(boolean, java.util.List<java.lang.String!>!);
+    method public java.util.List<java.lang.String!>! getColumnNames();
+    method public boolean isAutoGenerate();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.PrimaryKeyBundle!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SchemaBundle {
+    ctor public SchemaBundle(int, androidx.room.migration.bundle.DatabaseBundle!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.room.migration.bundle.SchemaBundle! deserialize(java.io.InputStream!) throws java.io.UnsupportedEncodingException;
+    method public androidx.room.migration.bundle.DatabaseBundle! getDatabase();
+    method public int getFormatVersion();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.SchemaBundle!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void serialize(androidx.room.migration.bundle.SchemaBundle!, java.io.File!) throws java.io.IOException;
+    field public static final int LATEST_FORMAT = 1; // 0x1
+  }
+
+}
+
diff --git a/room/runtime/api/2.2.0-beta01.txt b/room/runtime/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..1d210e5
--- /dev/null
+++ b/room/runtime/api/2.2.0-beta01.txt
@@ -0,0 +1,117 @@
+// Signature format: 3.0
+package androidx.room {
+
+  public class DatabaseConfiguration {
+    method public boolean isMigrationRequired(int, int);
+    method @Deprecated public boolean isMigrationRequiredFrom(int);
+    field public final boolean allowDestructiveMigrationOnDowngrade;
+    field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
+    field public final android.content.Context context;
+    field public final String? copyFromAssetPath;
+    field public final java.io.File? copyFromFile;
+    field public final androidx.room.RoomDatabase.JournalMode! journalMode;
+    field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
+    field public final boolean multiInstanceInvalidation;
+    field public final String? name;
+    field public final java.util.concurrent.Executor queryExecutor;
+    field public final boolean requireMigration;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
+    field public final java.util.concurrent.Executor transactionExecutor;
+  }
+
+  public class InvalidationTracker {
+    method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer);
+    method public void refreshVersionsAsync();
+    method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer);
+  }
+
+  public abstract static class InvalidationTracker.Observer {
+    ctor protected InvalidationTracker.Observer(String, java.lang.String!...);
+    ctor public InvalidationTracker.Observer(String![]);
+    method public abstract void onInvalidated(java.util.Set<java.lang.String!>);
+  }
+
+  public class Room {
+    ctor @Deprecated public Room();
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> databaseBuilder(android.content.Context, Class<T!>, String);
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> inMemoryDatabaseBuilder(android.content.Context, Class<T!>);
+    field public static final String MASTER_TABLE_NAME = "room_master_table";
+  }
+
+  public abstract class RoomDatabase {
+    ctor public RoomDatabase();
+    method @Deprecated public void beginTransaction();
+    method @WorkerThread public abstract void clearAllTables();
+    method public void close();
+    method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String);
+    method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
+    method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration!);
+    method @Deprecated public void endTransaction();
+    method public androidx.room.InvalidationTracker getInvalidationTracker();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
+    method public java.util.concurrent.Executor getQueryExecutor();
+    method public java.util.concurrent.Executor getTransactionExecutor();
+    method public boolean inTransaction();
+    method @CallSuper public void init(androidx.room.DatabaseConfiguration);
+    method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase);
+    method public boolean isOpen();
+    method public android.database.Cursor query(String, Object![]?);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery, android.os.CancellationSignal?);
+    method public void runInTransaction(Runnable);
+    method public <V> V! runInTransaction(java.util.concurrent.Callable<V!>);
+    method @Deprecated public void setTransactionSuccessful();
+    field @Deprecated protected java.util.List<androidx.room.RoomDatabase.Callback!>? mCallbacks;
+    field @Deprecated protected volatile androidx.sqlite.db.SupportSQLiteDatabase! mDatabase;
+  }
+
+  public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
+    method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
+    method public androidx.room.RoomDatabase.Builder<T!> allowMainThreadQueries();
+    method public T build();
+    method public androidx.room.RoomDatabase.Builder<T!> createFromAsset(String);
+    method public androidx.room.RoomDatabase.Builder<T!> createFromFile(java.io.File);
+    method public androidx.room.RoomDatabase.Builder<T!> enableMultiInstanceInvalidation();
+    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigration();
+    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationFrom(int...);
+    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationOnDowngrade();
+    method public androidx.room.RoomDatabase.Builder<T!> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory?);
+    method public androidx.room.RoomDatabase.Builder<T!> setJournalMode(androidx.room.RoomDatabase.JournalMode);
+    method public androidx.room.RoomDatabase.Builder<T!> setQueryExecutor(java.util.concurrent.Executor);
+    method public androidx.room.RoomDatabase.Builder<T!> setTransactionExecutor(java.util.concurrent.Executor);
+  }
+
+  public abstract static class RoomDatabase.Callback {
+    ctor public RoomDatabase.Callback();
+    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase);
+    method public void onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
+  public enum RoomDatabase.JournalMode {
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.JELLY_BEAN) public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
+  }
+
+  public static class RoomDatabase.MigrationContainer {
+    ctor public RoomDatabase.MigrationContainer();
+    method public void addMigrations(androidx.room.migration.Migration!...);
+    method public java.util.List<androidx.room.migration.Migration!>? findMigrationPath(int, int);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public abstract class Migration {
+    ctor public Migration(int, int);
+    method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
+    field public final int endVersion;
+    field public final int startVersion;
+  }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/runtime/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/runtime/api/res-2.2.0-beta01.txt
diff --git a/room/runtime/api/restricted_2.2.0-beta01.ignore b/room/runtime/api/restricted_2.2.0-beta01.ignore
new file mode 100644
index 0000000..6984c60
--- /dev/null
+++ b/room/runtime/api/restricted_2.2.0-beta01.ignore
@@ -0,0 +1,19 @@
+// Baseline format: 1.0
+ChangedType: androidx.room.InvalidationTracker#createLiveData(String[], boolean, java.util.concurrent.Callable<T>):
+    Method androidx.room.InvalidationTracker.createLiveData has changed return type from LiveData<T> to androidx.lifecycle.LiveData<T>
+ChangedType: androidx.room.InvalidationTracker#createLiveData(String[], java.util.concurrent.Callable<T>):
+    Method androidx.room.InvalidationTracker.createLiveData has changed return type from LiveData<T> to androidx.lifecycle.LiveData<T>
+
+
+InvalidNullConversion: androidx.room.InvalidationTracker#createLiveData(String[], boolean, java.util.concurrent.Callable<T>):
+    Attempted to remove @NonNull annotation from method androidx.room.InvalidationTracker.createLiveData(String[],boolean,java.util.concurrent.Callable<T>)
+InvalidNullConversion: androidx.room.InvalidationTracker#createLiveData(String[], java.util.concurrent.Callable<T>):
+    Attempted to remove @NonNull annotation from method androidx.room.InvalidationTracker.createLiveData(String[],java.util.concurrent.Callable<T>)
+
+
+RemovedMethod: androidx.room.paging.LimitOffsetDataSource#isInvalid():
+    Removed method androidx.room.paging.LimitOffsetDataSource.isInvalid()
+RemovedMethod: androidx.room.paging.LimitOffsetDataSource#loadInitial(LoadInitialParams, LoadInitialCallback<T>):
+    Removed method androidx.room.paging.LimitOffsetDataSource.loadInitial(LoadInitialParams,LoadInitialCallback<T>)
+RemovedMethod: androidx.room.paging.LimitOffsetDataSource#loadRange(LoadRangeParams, LoadRangeCallback<T>):
+    Removed method androidx.room.paging.LimitOffsetDataSource.loadRange(LoadRangeParams,LoadRangeCallback<T>)
diff --git a/room/runtime/api/restricted_2.2.0-beta01.txt b/room/runtime/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..6bc1371
--- /dev/null
+++ b/room/runtime/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,318 @@
+// Signature format: 3.0
+package androidx.room {
+
+  public class DatabaseConfiguration {
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode!, java.util.concurrent.Executor, boolean, java.util.Set<java.lang.Integer!>?);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode!, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context, String?, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory, androidx.room.RoomDatabase.MigrationContainer, java.util.List<androidx.room.RoomDatabase.Callback!>?, boolean, androidx.room.RoomDatabase.JournalMode!, java.util.concurrent.Executor, java.util.concurrent.Executor, boolean, boolean, boolean, java.util.Set<java.lang.Integer!>?, String?, java.io.File?);
+    method public boolean isMigrationRequired(int, int);
+    method @Deprecated public boolean isMigrationRequiredFrom(int);
+    field public final boolean allowDestructiveMigrationOnDowngrade;
+    field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.RoomDatabase.Callback!>? callbacks;
+    field public final android.content.Context context;
+    field public final String? copyFromAssetPath;
+    field public final java.io.File? copyFromFile;
+    field public final androidx.room.RoomDatabase.JournalMode! journalMode;
+    field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
+    field public final boolean multiInstanceInvalidation;
+    field public final String? name;
+    field public final java.util.concurrent.Executor queryExecutor;
+    field public final boolean requireMigration;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
+    field public final java.util.concurrent.Executor transactionExecutor;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class EntityDeletionOrUpdateAdapter<T> extends androidx.room.SharedSQLiteStatement {
+    ctor public EntityDeletionOrUpdateAdapter(androidx.room.RoomDatabase!);
+    method protected abstract void bind(androidx.sqlite.db.SupportSQLiteStatement!, T!);
+    method public final int handle(T!);
+    method public final int handleMultiple(Iterable<? extends T>!);
+    method public final int handleMultiple(T![]!);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class EntityInsertionAdapter<T> extends androidx.room.SharedSQLiteStatement {
+    ctor public EntityInsertionAdapter(androidx.room.RoomDatabase!);
+    method protected abstract void bind(androidx.sqlite.db.SupportSQLiteStatement!, T!);
+    method public final void insert(T!);
+    method public final void insert(T![]!);
+    method public final void insert(Iterable<? extends T>!);
+    method public final long insertAndReturnId(T!);
+    method public final long[]! insertAndReturnIdsArray(java.util.Collection<? extends T>!);
+    method public final long[]! insertAndReturnIdsArray(T![]!);
+    method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<? extends T>!);
+    method public final Long![]! insertAndReturnIdsArrayBox(T![]!);
+    method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(T![]!);
+    method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<? extends T>!);
+  }
+
+  public class InvalidationTracker {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase!, java.lang.String!...);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase!, java.util.Map<java.lang.String!,java.lang.String!>!, java.util.Map<java.lang.String!,java.util.Set<java.lang.String!>!>!, java.lang.String!...);
+    method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addWeakObserver(androidx.room.InvalidationTracker.Observer!);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T> androidx.lifecycle.LiveData<T!>! createLiveData(String![]!, java.util.concurrent.Callable<T!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T> androidx.lifecycle.LiveData<T!>! createLiveData(String![]!, boolean, java.util.concurrent.Callable<T!>!);
+    method public void refreshVersionsAsync();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @WorkerThread public void refreshVersionsSync();
+    method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer);
+  }
+
+  public abstract static class InvalidationTracker.Observer {
+    ctor protected InvalidationTracker.Observer(String, java.lang.String!...);
+    ctor public InvalidationTracker.Observer(String![]);
+    method public abstract void onInvalidated(java.util.Set<java.lang.String!>);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MultiInstanceInvalidationService extends android.app.Service {
+    ctor public MultiInstanceInvalidationService();
+    method public android.os.IBinder? onBind(android.content.Intent!);
+  }
+
+  public class Room {
+    ctor @Deprecated public Room();
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> databaseBuilder(android.content.Context, Class<T!>, String);
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T!> inMemoryDatabaseBuilder(android.content.Context, Class<T!>);
+    field public static final String MASTER_TABLE_NAME = "room_master_table";
+  }
+
+  public abstract class RoomDatabase {
+    ctor public RoomDatabase();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void assertNotMainThread();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public void assertNotSuspendingTransaction();
+    method @Deprecated public void beginTransaction();
+    method @WorkerThread public abstract void clearAllTables();
+    method public void close();
+    method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String);
+    method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
+    method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration!);
+    method @Deprecated public void endTransaction();
+    method public androidx.room.InvalidationTracker getInvalidationTracker();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
+    method public java.util.concurrent.Executor getQueryExecutor();
+    method public java.util.concurrent.Executor getTransactionExecutor();
+    method public boolean inTransaction();
+    method @CallSuper public void init(androidx.room.DatabaseConfiguration);
+    method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase);
+    method public boolean isOpen();
+    method public android.database.Cursor query(String, Object![]?);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery, android.os.CancellationSignal?);
+    method public void runInTransaction(Runnable);
+    method public <V> V! runInTransaction(java.util.concurrent.Callable<V!>);
+    method @Deprecated public void setTransactionSuccessful();
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int MAX_BIND_PARAMETER_CNT = 999; // 0x3e7
+    field @Deprecated protected java.util.List<androidx.room.RoomDatabase.Callback!>? mCallbacks;
+    field @Deprecated protected volatile androidx.sqlite.db.SupportSQLiteDatabase! mDatabase;
+  }
+
+  public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T!> addCallback(androidx.room.RoomDatabase.Callback);
+    method public androidx.room.RoomDatabase.Builder<T!> addMigrations(androidx.room.migration.Migration!...);
+    method public androidx.room.RoomDatabase.Builder<T!> allowMainThreadQueries();
+    method public T build();
+    method public androidx.room.RoomDatabase.Builder<T!> createFromAsset(String);
+    method public androidx.room.RoomDatabase.Builder<T!> createFromFile(java.io.File);
+    method public androidx.room.RoomDatabase.Builder<T!> enableMultiInstanceInvalidation();
+    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigration();
+    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationFrom(int...);
+    method public androidx.room.RoomDatabase.Builder<T!> fallbackToDestructiveMigrationOnDowngrade();
+    method public androidx.room.RoomDatabase.Builder<T!> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory?);
+    method public androidx.room.RoomDatabase.Builder<T!> setJournalMode(androidx.room.RoomDatabase.JournalMode);
+    method public androidx.room.RoomDatabase.Builder<T!> setQueryExecutor(java.util.concurrent.Executor);
+    method public androidx.room.RoomDatabase.Builder<T!> setTransactionExecutor(java.util.concurrent.Executor);
+  }
+
+  public abstract static class RoomDatabase.Callback {
+    ctor public RoomDatabase.Callback();
+    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase);
+    method public void onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
+  public enum RoomDatabase.JournalMode {
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
+    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.JELLY_BEAN) public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
+  }
+
+  public static class RoomDatabase.MigrationContainer {
+    ctor public RoomDatabase.MigrationContainer();
+    method public void addMigrations(androidx.room.migration.Migration!...);
+    method public java.util.List<androidx.room.migration.Migration!>? findMigrationPath(int, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomOpenHelper extends androidx.sqlite.db.SupportSQLiteOpenHelper.Callback {
+    ctor public RoomOpenHelper(androidx.room.DatabaseConfiguration, androidx.room.RoomOpenHelper.Delegate, String, String);
+    ctor public RoomOpenHelper(androidx.room.DatabaseConfiguration, androidx.room.RoomOpenHelper.Delegate, String);
+    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract static class RoomOpenHelper.Delegate {
+    ctor public RoomOpenHelper.Delegate(int);
+    method protected abstract void createAllTables(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method protected abstract void dropAllTables(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method protected abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method protected abstract void onOpen(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method protected void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method protected void onPreMigrate(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method protected androidx.room.RoomOpenHelper.ValidationResult onValidateSchema(androidx.sqlite.db.SupportSQLiteDatabase);
+    method @Deprecated protected void validateMigration(androidx.sqlite.db.SupportSQLiteDatabase!);
+    field public final int version;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class RoomOpenHelper.ValidationResult {
+    ctor public RoomOpenHelper.ValidationResult(boolean, String?);
+    field public final String? expectedFoundMsg;
+    field public final boolean isValid;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomSQLiteQuery implements androidx.sqlite.db.SupportSQLiteProgram androidx.sqlite.db.SupportSQLiteQuery {
+    method public static androidx.room.RoomSQLiteQuery! acquire(String!, int);
+    method public void bindBlob(int, byte[]!);
+    method public void bindDouble(int, double);
+    method public void bindLong(int, long);
+    method public void bindNull(int);
+    method public void bindString(int, String!);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+    method public void clearBindings();
+    method public void close();
+    method public void copyArgumentsFrom(androidx.room.RoomSQLiteQuery!);
+    method public static androidx.room.RoomSQLiteQuery! copyFrom(androidx.sqlite.db.SupportSQLiteQuery!);
+    method public int getArgCount();
+    method public String! getSql();
+    method public void release();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class SharedSQLiteStatement {
+    ctor public SharedSQLiteStatement(androidx.room.RoomDatabase!);
+    method public androidx.sqlite.db.SupportSQLiteStatement! acquire();
+    method protected void assertNotMainThread();
+    method protected abstract String! createQuery();
+    method public void release(androidx.sqlite.db.SupportSQLiteStatement!);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public abstract class Migration {
+    ctor public Migration(int, int);
+    method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
+    field public final int endVersion;
+    field public final int startVersion;
+  }
+
+}
+
+package androidx.room.paging {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class LimitOffsetDataSource<T> extends androidx.paging.PositionalDataSource<T> {
+    ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase!, androidx.sqlite.db.SupportSQLiteQuery!, boolean, java.lang.String!...);
+    ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase!, androidx.room.RoomSQLiteQuery!, boolean, java.lang.String!...);
+    method protected abstract java.util.List<T!>! convertRows(android.database.Cursor!);
+    method public void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams, androidx.paging.PositionalDataSource.LoadInitialCallback<T!>);
+    method public void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams, androidx.paging.PositionalDataSource.LoadRangeCallback<T!>);
+  }
+
+}
+
+package androidx.room.util {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CopyLock {
+    ctor public CopyLock(String, java.io.File, boolean);
+    method public void lock();
+    method public void unlock();
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CursorUtil {
+    method public static android.database.Cursor copyAndClose(android.database.Cursor);
+    method public static int getColumnIndex(android.database.Cursor, String);
+    method public static int getColumnIndexOrThrow(android.database.Cursor, String);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DBUtil {
+    method public static android.os.CancellationSignal? createCancellationSignal();
+    method public static void dropFtsSyncTriggers(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method @Deprecated public static android.database.Cursor query(androidx.room.RoomDatabase!, androidx.sqlite.db.SupportSQLiteQuery!, boolean);
+    method public static android.database.Cursor query(androidx.room.RoomDatabase, androidx.sqlite.db.SupportSQLiteQuery, boolean, android.os.CancellationSignal?);
+    method public static int readVersion(java.io.File) throws java.io.IOException;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FileUtil {
+    method public static void copy(java.nio.channels.ReadableByteChannel, java.nio.channels.FileChannel) throws java.io.IOException;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsTableInfo {
+    ctor public FtsTableInfo(String!, java.util.Set<java.lang.String!>!, java.util.Set<java.lang.String!>!);
+    ctor public FtsTableInfo(String!, java.util.Set<java.lang.String!>!, String!);
+    method public static androidx.room.util.FtsTableInfo! read(androidx.sqlite.db.SupportSQLiteDatabase!, String!);
+    field public final java.util.Set<java.lang.String!>! columns;
+    field public final String! name;
+    field public final java.util.Set<java.lang.String!>! options;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class SneakyThrow {
+    method public static void reThrow(Exception);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class StringUtil {
+    method public static void appendPlaceholders(StringBuilder!, int);
+    method public static String? joinIntoString(java.util.List<java.lang.Integer!>?);
+    method public static StringBuilder! newStringBuilder();
+    method public static java.util.List<java.lang.Integer!>? splitToIntList(String?);
+    field public static final String![]! EMPTY_STRING_ARRAY;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TableInfo {
+    ctor public TableInfo(String!, java.util.Map<java.lang.String!,androidx.room.util.TableInfo.Column!>!, java.util.Set<androidx.room.util.TableInfo.ForeignKey!>!, java.util.Set<androidx.room.util.TableInfo.Index!>!);
+    ctor public TableInfo(String!, java.util.Map<java.lang.String!,androidx.room.util.TableInfo.Column!>!, java.util.Set<androidx.room.util.TableInfo.ForeignKey!>!);
+    method public static androidx.room.util.TableInfo! read(androidx.sqlite.db.SupportSQLiteDatabase!, String!);
+    field public static final int CREATED_FROM_DATABASE = 2; // 0x2
+    field public static final int CREATED_FROM_ENTITY = 1; // 0x1
+    field public static final int CREATED_FROM_UNKNOWN = 0; // 0x0
+    field public final java.util.Map<java.lang.String!,androidx.room.util.TableInfo.Column!>! columns;
+    field public final java.util.Set<androidx.room.util.TableInfo.ForeignKey!>! foreignKeys;
+    field public final java.util.Set<androidx.room.util.TableInfo.Index!>? indices;
+    field public final String! name;
+  }
+
+  public static class TableInfo.Column {
+    ctor @Deprecated public TableInfo.Column(String!, String!, boolean, int);
+    ctor public TableInfo.Column(String!, String!, boolean, int, String!, int);
+    method public boolean isPrimaryKey();
+    field public final int affinity;
+    field public final String! defaultValue;
+    field public final String! name;
+    field public final boolean notNull;
+    field public final int primaryKeyPosition;
+    field public final String! type;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class TableInfo.ForeignKey {
+    ctor public TableInfo.ForeignKey(String, String, String, java.util.List<java.lang.String!>, java.util.List<java.lang.String!>);
+    field public final java.util.List<java.lang.String!> columnNames;
+    field public final String onDelete;
+    field public final String onUpdate;
+    field public final java.util.List<java.lang.String!> referenceColumnNames;
+    field public final String referenceTable;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class TableInfo.Index {
+    ctor public TableInfo.Index(String!, boolean, java.util.List<java.lang.String!>!);
+    field public static final String DEFAULT_PREFIX = "index_";
+    field public final java.util.List<java.lang.String!>! columns;
+    field public final String! name;
+    field public final boolean unique;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewInfo {
+    ctor public ViewInfo(String!, String!);
+    method public static androidx.room.util.ViewInfo! read(androidx.sqlite.db.SupportSQLiteDatabase!, String!);
+    field public final String! name;
+    field public final String! sql;
+  }
+
+}
+
diff --git a/room/rxjava2/api/2.2.0-beta01.txt b/room/rxjava2/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..07ab5f2
--- /dev/null
+++ b/room/rxjava2/api/2.2.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 3.0
+package androidx.room {
+
+  public class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String!);
+  }
+
+  public class RxRoom {
+    ctor @Deprecated public RxRoom();
+    method public static io.reactivex.Flowable<java.lang.Object!>! createFlowable(androidx.room.RoomDatabase!, java.lang.String!...);
+    method public static io.reactivex.Observable<java.lang.Object!>! createObservable(androidx.room.RoomDatabase!, java.lang.String!...);
+    field public static final Object! NOTHING;
+  }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/rxjava2/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/rxjava2/api/res-2.2.0-beta01.txt
diff --git a/room/rxjava2/api/restricted_2.2.0-beta01.txt b/room/rxjava2/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..869770f
--- /dev/null
+++ b/room/rxjava2/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,21 @@
+// Signature format: 3.0
+package androidx.room {
+
+  public class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String!);
+  }
+
+  public class RxRoom {
+    ctor @Deprecated public RxRoom();
+    method public static io.reactivex.Flowable<java.lang.Object!>! createFlowable(androidx.room.RoomDatabase!, java.lang.String!...);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Flowable<T!>! createFlowable(androidx.room.RoomDatabase!, String![]!, java.util.concurrent.Callable<T!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Flowable<T!>! createFlowable(androidx.room.RoomDatabase!, boolean, String![]!, java.util.concurrent.Callable<T!>!);
+    method public static io.reactivex.Observable<java.lang.Object!>! createObservable(androidx.room.RoomDatabase!, java.lang.String!...);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Observable<T!>! createObservable(androidx.room.RoomDatabase!, String![]!, java.util.concurrent.Callable<T!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Observable<T!>! createObservable(androidx.room.RoomDatabase!, boolean, String![]!, java.util.concurrent.Callable<T!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Single<T!>! createSingle(java.util.concurrent.Callable<T!>!);
+    field public static final Object! NOTHING;
+  }
+
+}
+
diff --git a/room/testing/api/2.2.0-beta01.txt b/room/testing/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..86e22e8
--- /dev/null
+++ b/room/testing/api/2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room.testing {
+
+  public class MigrationTestHelper extends org.junit.rules.TestWatcher {
+    ctor public MigrationTestHelper(android.app.Instrumentation!, String!);
+    ctor public MigrationTestHelper(android.app.Instrumentation!, String!, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory!);
+    method public void closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void closeWhenFinished(androidx.room.RoomDatabase!);
+    method public androidx.sqlite.db.SupportSQLiteDatabase! createDatabase(String!, int) throws java.io.IOException;
+    method public androidx.sqlite.db.SupportSQLiteDatabase! runMigrationsAndValidate(String!, int, boolean, androidx.room.migration.Migration!...) throws java.io.IOException;
+  }
+
+}
+
diff --git a/biometric/api/res-1.0.0-beta01.txt b/room/testing/api/res-2.2.0-beta01.txt
similarity index 100%
copy from biometric/api/res-1.0.0-beta01.txt
copy to room/testing/api/res-2.2.0-beta01.txt
diff --git a/room/testing/api/restricted_2.2.0-beta01.txt b/room/testing/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..86e22e8
--- /dev/null
+++ b/room/testing/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 3.0
+package androidx.room.testing {
+
+  public class MigrationTestHelper extends org.junit.rules.TestWatcher {
+    ctor public MigrationTestHelper(android.app.Instrumentation!, String!);
+    ctor public MigrationTestHelper(android.app.Instrumentation!, String!, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory!);
+    method public void closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void closeWhenFinished(androidx.room.RoomDatabase!);
+    method public androidx.sqlite.db.SupportSQLiteDatabase! createDatabase(String!, int) throws java.io.IOException;
+    method public androidx.sqlite.db.SupportSQLiteDatabase! runMigrationsAndValidate(String!, int, boolean, androidx.room.migration.Migration!...) throws java.io.IOException;
+  }
+
+}
+
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java
index dbddf77..a73d222 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemo.java
@@ -47,33 +47,30 @@
         hostInFragmentButton.setOnClickListener(view -> launchFragmentHost());
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             biometricBoundKeyDemoButton.setOnClickListener(view -> launchBiometricBoundKeyDemo());
-        } else {
-            biometricBoundKeyDemoButton.setVisibility(View.GONE);
-        }
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
             credentialBoundKeyDemoButton.setOnClickListener(view -> launchCredentialBoundKeyDemo());
         } else {
+            biometricBoundKeyDemoButton.setVisibility(View.GONE);
             credentialBoundKeyDemoButton.setVisibility(View.GONE);
         }
     }
 
     private void launchActivityHost() {
-        Intent intent = new Intent(this, BiometricPromptDemoActivityHost.class);
+        final Intent intent = new Intent(this, BiometricPromptDemoActivityHost.class);
         startActivity(intent);
     }
 
     private void launchFragmentHost() {
-        Intent intent = new Intent(this, BiometricPromptDemoFragmentHostActivity.class);
+        final Intent intent = new Intent(this, BiometricPromptDemoFragmentHostActivity.class);
         startActivity(intent);
     }
 
     private void launchBiometricBoundKeyDemo() {
-        Intent intent = new Intent(this, BiometricPromptDemoBiometricBoundKeyActivity.class);
+        final Intent intent = new Intent(this, BiometricPromptDemoBiometricBoundKeyActivity.class);
         startActivity(intent);
     }
 
     private void launchCredentialBoundKeyDemo() {
-        Intent intent = new Intent(this, BiometricPromptDemoCredentialBoundKeyActivity.class);
+        final Intent intent = new Intent(this, BiometricPromptDemoCredentialBoundKeyActivity.class);
         startActivity(intent);
     }
 }
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
index f14163a..ae47efb 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
@@ -17,7 +17,6 @@
 package com.example.android.biometric;
 
 import android.content.Context;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -162,12 +161,6 @@
             }
             log("canAuthenticate: " + message);
         });
-
-
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
-            mAllowDeviceCredentialCheckbox.setEnabled(false);
-            mAllowDeviceCredentialCheckbox.setChecked(false);
-        }
     }
 
     void onPause() {
@@ -196,8 +189,7 @@
                                 + mCounter)
                 .setConfirmationRequired(mRequireConfirmationCheckbox.isChecked());
 
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
-                && mAllowDeviceCredentialCheckbox.isChecked()) {
+        if (mAllowDeviceCredentialCheckbox.isChecked()) {
             builder.setDeviceCredentialAllowed(true);
         } else {
             builder.setNegativeButtonText("Negative Button " + mCounter);
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java
index 6e4dd92..b475450 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoCredentialBoundKeyActivity.java
@@ -25,6 +25,7 @@
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.biometric.BiometricPrompt;
 import androidx.fragment.app.FragmentActivity;
@@ -50,7 +51,7 @@
 /**
  * Demo activity that shows how BiometricPrompt can be used with credential bound secret keys.
  */
-@RequiresApi(api = Build.VERSION_CODES.Q)
+@RequiresApi(api = Build.VERSION_CODES.M)
 public class BiometricPromptDemoCredentialBoundKeyActivity extends FragmentActivity {
 
     private static final String TAG = "bio_prompt_demo_control";
@@ -150,7 +151,7 @@
     };
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.biometric_prompt_demo_credential_bound_key);
 
diff --git a/sharetarget/build.gradle b/sharetarget/build.gradle
index b750a70..cc27624 100644
--- a/sharetarget/build.gradle
+++ b/sharetarget/build.gradle
@@ -25,7 +25,7 @@
 }
 
 dependencies {
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
     api(GUAVA_LISTENABLE_FUTURE)
     implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha02")
diff --git a/sharetarget/integration-tests/testapp/build.gradle b/sharetarget/integration-tests/testapp/build.gradle
index 4cf7a1f..fd2075d 100644
--- a/sharetarget/integration-tests/testapp/build.gradle
+++ b/sharetarget/integration-tests/testapp/build.gradle
@@ -22,8 +22,8 @@
 }
 
 dependencies {
-    api(project(":core:core"))
-    api(project(":sharetarget"))
+    api("androidx.core:core:1.1.0")
+    api("androidx.sharetarget:sharetarget:1.0.0-alpha02")
     api(project(":appcompat"))
     api(CONSTRAINT_LAYOUT, { transitive = true })
 }
diff --git a/slices/builders/build.gradle b/slices/builders/build.gradle
index 914633c..63bbe8d 100644
--- a/slices/builders/build.gradle
+++ b/slices/builders/build.gradle
@@ -28,7 +28,7 @@
     implementation(project(":slice-core"))
     api(project(":remotecallback"))
     implementation "androidx.annotation:annotation:1.1.0"
-    implementation "androidx.core:core:1.1.0-rc01"
+    implementation "androidx.core:core:1.1.0"
     implementation project(':collection:collection')
 }
 
diff --git a/slices/core/api/1.1.0-alpha02.txt b/slices/core/api/1.1.0-alpha02.txt
index bada082..728a150 100644
--- a/slices/core/api/1.1.0-alpha02.txt
+++ b/slices/core/api/1.1.0-alpha02.txt
@@ -64,7 +64,7 @@
   public abstract class SliceProviderWithCallbacks<T extends androidx.slice.SliceProviderWithCallbacks> extends androidx.slice.SliceProvider implements androidx.remotecallback.CallbackBase<T> androidx.remotecallback.CallbackReceiver<T> {
     ctor public SliceProviderWithCallbacks();
     method public T createRemoteCallback(android.content.Context);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String?, android.os.Bundle, String?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String, android.os.Bundle, String?);
   }
 
 }
diff --git a/slices/core/api/current.txt b/slices/core/api/current.txt
index bada082..728a150 100644
--- a/slices/core/api/current.txt
+++ b/slices/core/api/current.txt
@@ -64,7 +64,7 @@
   public abstract class SliceProviderWithCallbacks<T extends androidx.slice.SliceProviderWithCallbacks> extends androidx.slice.SliceProvider implements androidx.remotecallback.CallbackBase<T> androidx.remotecallback.CallbackReceiver<T> {
     ctor public SliceProviderWithCallbacks();
     method public T createRemoteCallback(android.content.Context);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String?, android.os.Bundle, String?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String, android.os.Bundle, String?);
   }
 
 }
diff --git a/slices/core/api/restricted_1.1.0-alpha02.txt b/slices/core/api/restricted_1.1.0-alpha02.txt
index 3cf1dca..878a544 100644
--- a/slices/core/api/restricted_1.1.0-alpha02.txt
+++ b/slices/core/api/restricted_1.1.0-alpha02.txt
@@ -126,7 +126,7 @@
   public abstract class SliceProviderWithCallbacks<T extends androidx.slice.SliceProviderWithCallbacks> extends androidx.slice.SliceProvider implements androidx.remotecallback.CallbackBase<T> androidx.remotecallback.CallbackReceiver<T> {
     ctor public SliceProviderWithCallbacks();
     method public T createRemoteCallback(android.content.Context);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String?, android.os.Bundle, String?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String, android.os.Bundle, String?);
   }
 
   @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SliceSpec implements androidx.versionedparcelable.VersionedParcelable {
diff --git a/slices/core/api/restricted_current.txt b/slices/core/api/restricted_current.txt
index 3cf1dca..878a544 100644
--- a/slices/core/api/restricted_current.txt
+++ b/slices/core/api/restricted_current.txt
@@ -126,7 +126,7 @@
   public abstract class SliceProviderWithCallbacks<T extends androidx.slice.SliceProviderWithCallbacks> extends androidx.slice.SliceProvider implements androidx.remotecallback.CallbackBase<T> androidx.remotecallback.CallbackReceiver<T> {
     ctor public SliceProviderWithCallbacks();
     method public T createRemoteCallback(android.content.Context);
-    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String?, android.os.Bundle, String?);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.remotecallback.RemoteCallback toRemoteCallback(Class<T!>, android.content.Context, String, android.os.Bundle, String?);
   }
 
   @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class SliceSpec implements androidx.versionedparcelable.VersionedParcelable {
diff --git a/slices/core/src/main/java/androidx/slice/SliceProvider.java b/slices/core/src/main/java/androidx/slice/SliceProvider.java
index a4b57aa..6164547 100644
--- a/slices/core/src/main/java/androidx/slice/SliceProvider.java
+++ b/slices/core/src/main/java/androidx/slice/SliceProvider.java
@@ -235,6 +235,7 @@
     @Override
     public Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
         if (Build.VERSION.SDK_INT < 19) return null;
+        if (extras == null) return null;
         return mCompat != null ? mCompat.call(method, arg, extras) : null;
     }
 
diff --git a/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java b/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
index 5404f79..fffb2d2 100644
--- a/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
+++ b/slices/core/src/main/java/androidx/slice/SliceProviderWithCallbacks.java
@@ -59,6 +59,7 @@
     @Nullable
     @Override
     public Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) {
+        if (extras == null) return null;
         if (ProviderRelayReceiver.METHOD_PROVIDER_CALLBACK.equals(method)) {
             CallbackHandlerRegistry.sInstance.invokeCallback(getContext(), this, extras);
             return null;
@@ -81,7 +82,7 @@
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public RemoteCallback toRemoteCallback(@NonNull Class<T> cls, @NonNull Context context,
-            @Nullable String authority, @NonNull Bundle args, @Nullable String method) {
+            @NonNull String authority, @NonNull Bundle args, @Nullable String method) {
         if (authority == null) {
             throw new IllegalStateException(
                     "ContentProvider must be attached before creating callbacks");
diff --git a/slidingpanelayout/build.gradle b/slidingpanelayout/build.gradle
index b9732d5..7738665 100644
--- a/slidingpanelayout/build.gradle
+++ b/slidingpanelayout/build.gradle
@@ -9,7 +9,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     api(project(":customview"))
 }
 
diff --git a/sqlite/OWNERS b/sqlite/OWNERS
index fc51372..edfaa80 100644
--- a/sqlite/OWNERS
+++ b/sqlite/OWNERS
@@ -1,2 +1,3 @@
 sergeyv@google.com
-yboyar@google.com
\ No newline at end of file
+yboyar@google.com
+danysantiago@google.com
\ No newline at end of file
diff --git a/swiperefreshlayout/OWNERS b/swiperefreshlayout/OWNERS
new file mode 100644
index 0000000..f92940c
--- /dev/null
+++ b/swiperefreshlayout/OWNERS
@@ -0,0 +1 @@
+shepshapard@google.com
\ No newline at end of file
diff --git a/swiperefreshlayout/build.gradle b/swiperefreshlayout/build.gradle
index 1309851..46c3da4 100644
--- a/swiperefreshlayout/build.gradle
+++ b/swiperefreshlayout/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
     api("androidx.interpolator:interpolator:1.0.0")
 
     androidTestImplementation(JUNIT)
diff --git a/textclassifier/build.gradle b/textclassifier/build.gradle
index d2cd121..92508eb 100644
--- a/textclassifier/build.gradle
+++ b/textclassifier/build.gradle
@@ -13,7 +13,7 @@
     api("androidx.annotation:annotation:1.1.0")
     implementation("androidx.collection:collection:1.0.0")
     // TODO: change to 1.1.0-alpha04 after release
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index b4cbc11..902b0d5 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -10,7 +10,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
     androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
index 2f7e1c3..4f790c7 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ClickableTest.kt
@@ -21,6 +21,8 @@
 import androidx.ui.core.TestTag
 import androidx.ui.core.Text
 import androidx.ui.layout.Center
+import androidx.ui.test.assertHasClickAction
+import androidx.ui.test.assertHasNoClickAction
 import androidx.ui.test.assertSemanticsIsEqualTo
 import androidx.ui.test.createComposeRule
 import androidx.ui.test.createFullSemantics
@@ -57,6 +59,7 @@
                     isEnabled = true
                 )
             )
+            .assertHasClickAction()
     }
 
     @Test
@@ -77,6 +80,7 @@
                     isEnabled = false
                 )
             )
+            .assertHasNoClickAction()
     }
 
     @Test
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
index 66473034..fabf791 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
@@ -29,7 +29,7 @@
  *
  * @sample androidx.ui.foundation.samples.ClickableSample
  *
- * @param onClick will be called when user clicked on the button. The button will not be
+ * @param onClick will be called when user clicked on the button. The children will not be
  *  clickable when it is null.
  * @param consumeDownOnStart true means [PressReleasedGestureDetector] should consume
  *  down events. Provide false if you have some visual feedback like Ripples,
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt
index 4ce2cf1..bf850804 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Text.kt
@@ -205,7 +205,7 @@
             accessibilityLabel = text.text
         }
     ) {
-        val textPainter = +memo(
+        val textDelegate = +memo(
             text,
             mergedStyle,
             paragraphStyle,
@@ -232,17 +232,17 @@
             OnPositioned(onPositioned = { layoutCoordinates.value = it })
             Draw { canvas, _ ->
                 internalSelection.value?.let {
-                    textPainter.paintBackground(
+                    textDelegate.paintBackground(
                         it.start, it.end, selectionColor, canvas
                     )
                 }
-                textPainter.paint(canvas)
+                textDelegate.paint(canvas)
             }
         }
         ComplexLayout(children) {
             measure { _, constraints ->
-                textPainter.layout(constraints)
-                layout(textPainter.width.px.round(), textPainter.height.px.round()) {}
+                textDelegate.layout(constraints)
+                layout(textDelegate.width.px.round(), textDelegate.height.px.round()) {}
             }
             minIntrinsicWidth { _, _ ->
                 // TODO(popam): discuss with the Text team about this
@@ -251,16 +251,16 @@
                 // textDelegate.minIntrinsicWidth.px.round()
             }
             minIntrinsicHeight { _, w ->
-                textPainter.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
-                textPainter.height.px.round()
+                textDelegate.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
+                textDelegate.height.px.round()
             }
             maxIntrinsicWidth { _, h ->
-                textPainter.layout(Constraints(0.ipx, IntPx.Infinity, 0.ipx, h))
-                textPainter.maxIntrinsicWidth.px.round()
+                textDelegate.layout(Constraints(0.ipx, IntPx.Infinity, 0.ipx, h))
+                textDelegate.maxIntrinsicWidth.px.round()
             }
             maxIntrinsicHeight { _, w ->
-                textPainter.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
-                textPainter.height.px.round()
+                textDelegate.layout(Constraints(0.ipx, w, 0.ipx, IntPx.Infinity))
+                textDelegate.height.px.round()
             }
         }
 
@@ -290,7 +290,7 @@
                             selectionCoordinates = Pair(startPx, endPx),
                             mode = mode,
                             onSelectionChange = { internalSelection.value = it },
-                            textDelegate = textPainter
+                            textDelegate = textDelegate
                         )
                         if (!textSelectionProcessor.isSelected) return null
 
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt b/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
index 9dfb3d3..cf28b6e 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
@@ -100,7 +100,7 @@
     val (visualText, offsetMap) = +memo(value, visualTransformation) {
         TextFieldDelegate.applyVisualFilter(value, visualTransformation)
     }
-    val textPainter = +memo(visualText, mergedStyle, density, resourceLoader) {
+    val textDelegate = +memo(visualText, mergedStyle, density, resourceLoader) {
         // TODO(nona): Add parameter for text direction, softwrap, etc.
         TextDelegate(
             text = visualText,
@@ -131,7 +131,7 @@
                 textInputService?.let { textInputService ->
                     TextFieldDelegate.notifyFocusedRect(
                         value,
-                        textPainter,
+                        textDelegate,
                         coords,
                         textInputService,
                         hasFocus.value,
@@ -153,7 +153,7 @@
         onRelease = {
             TextFieldDelegate.onRelease(
                 it,
-                textPainter,
+                textDelegate,
                 processor,
                 offsetMap,
                 onValueChange,
@@ -170,7 +170,7 @@
                         coords.value = it
                         TextFieldDelegate.notifyFocusedRect(
                             value,
-                            textPainter,
+                            textDelegate,
                             it,
                             textInputService,
                             hasFocus.value,
@@ -182,12 +182,12 @@
                     canvas,
                     value,
                     offsetMap,
-                    textPainter,
+                    textDelegate,
                     hasFocus.value,
                     editorStyle) }
             },
             measureBlock = { _, constraints ->
-                TextFieldDelegate.layout(textPainter, constraints).let {
+                TextFieldDelegate.layout(textDelegate, constraints).let {
                     layout(it.first, it.second) {}
                 }
             }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt b/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
index 1d61351..bd7108d 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
@@ -88,7 +88,7 @@
             // We anyway need to compute layout for preventing NPE during draw which require layout
             // result.
             // TODO(nona): Fix this?
-            textDelegate.layout(constraints)
+            textDelegate.layout(Constraints.tightConstraintsForWidth(constraints.maxWidth))
 
             val isEmptyText = textDelegate.text.text.isEmpty()
             val height = if (isEmptyText) {
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
index 085a83f..179d4c5 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
@@ -362,7 +362,10 @@
         assertEquals(1024.px.round(), res.first)
         assertEquals(512.px.round(), res.second)
 
-        verify(mDelegate, times(1)).layout(constraints)
+        val captor = argumentCaptor<Constraints>()
+        verify(mDelegate, times(1)).layout(captor.capture())
+        assertEquals(1024.ipx, captor.firstValue.minWidth)
+        assertEquals(1024.ipx, captor.firstValue.maxWidth)
     }
 
     @Test
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt
index 376e7d8..2572b53 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxUiTest.kt
@@ -29,6 +29,7 @@
 import androidx.ui.foundation.semantics.toggleableState
 import androidx.ui.layout.Column
 import androidx.ui.semantics.accessibilityValue
+import androidx.ui.test.assertHasNoClickAction
 import androidx.ui.test.assertIsChecked
 import androidx.ui.test.assertIsUnchecked
 import androidx.ui.test.assertSemanticsIsEqualTo
@@ -126,9 +127,7 @@
         }
 
         findByTag(defaultTag)
-            .assertIsUnchecked()
-            .doClick()
-            .assertIsUnchecked()
+            .assertHasNoClickAction()
     }
 
     @Test
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt
index 7d4afcf..4bd7229 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/SwitchUiTest.kt
@@ -27,6 +27,7 @@
 import androidx.ui.foundation.semantics.toggleableState
 import androidx.ui.layout.Column
 import androidx.ui.semantics.accessibilityValue
+import androidx.ui.test.assertHasNoClickAction
 import androidx.ui.test.assertIsChecked
 import androidx.ui.test.assertIsUnchecked
 import androidx.ui.test.assertSemanticsIsEqualTo
@@ -116,9 +117,7 @@
             }
         }
         findByTag(defaultSwitchTag)
-            .assertIsUnchecked()
-            .doClick()
-            .assertIsUnchecked()
+            .assertHasNoClickAction()
     }
 
     @Test
diff --git a/ui/ui-test/api/1.0.0-alpha01.txt b/ui/ui-test/api/1.0.0-alpha01.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/1.0.0-alpha01.txt
+++ b/ui/ui-test/api/1.0.0-alpha01.txt
@@ -10,6 +10,8 @@
     ctor public AssertionsKt();
     method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
     method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
     method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
-    method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
     method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
   }
@@ -60,6 +61,7 @@
 
   public final class FiltersKt {
     ctor public FiltersKt();
+    method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
   }
diff --git a/ui/ui-test/api/current.txt b/ui/ui-test/api/current.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/current.txt
+++ b/ui/ui-test/api/current.txt
@@ -10,6 +10,8 @@
     ctor public AssertionsKt();
     method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
     method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
     method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
-    method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
     method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
   }
@@ -60,6 +61,7 @@
 
   public final class FiltersKt {
     ctor public FiltersKt();
+    method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
   }
diff --git a/ui/ui-test/api/restricted_1.0.0-alpha01.txt b/ui/ui-test/api/restricted_1.0.0-alpha01.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-test/api/restricted_1.0.0-alpha01.txt
@@ -10,6 +10,8 @@
     ctor public AssertionsKt();
     method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
     method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
     method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
-    method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
     method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
   }
@@ -60,6 +61,7 @@
 
   public final class FiltersKt {
     ctor public FiltersKt();
+    method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
   }
diff --git a/ui/ui-test/api/restricted_current.txt b/ui/ui-test/api/restricted_current.txt
index 9fd8bf1..3d54f9f 100644
--- a/ui/ui-test/api/restricted_current.txt
+++ b/ui/ui-test/api/restricted_current.txt
@@ -10,6 +10,8 @@
     ctor public AssertionsKt();
     method public static java.util.List<androidx.ui.test.SemanticsNodeInteraction> assertCountEquals(java.util.List<androidx.ui.test.SemanticsNodeInteraction>, int count);
     method public static void assertDoesNotExist(kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> selector);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasClickAction(androidx.ui.test.SemanticsNodeInteraction);
+    method public static androidx.ui.test.SemanticsNodeInteraction assertHasNoClickAction(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsChecked(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsHidden(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsInMutuallyExclusiveGroup(androidx.ui.test.SemanticsNodeInteraction);
@@ -19,7 +21,6 @@
     method public static androidx.ui.test.SemanticsNodeInteraction assertIsVisible(androidx.ui.test.SemanticsNodeInteraction);
     method public static void assertNoLongerExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertSemanticsIsEqualTo(androidx.ui.test.SemanticsNodeInteraction, androidx.ui.core.semantics.SemanticsConfiguration expectedProperties);
-    method public static void assertStillExists(androidx.ui.test.SemanticsNodeInteraction);
     method public static androidx.ui.test.SemanticsNodeInteraction assertValueEquals(androidx.ui.test.SemanticsNodeInteraction, String value);
     method public static void verify(androidx.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.String> assertionMessage, kotlin.jvm.functions.Function1<? super androidx.ui.core.semantics.SemanticsConfiguration,java.lang.Boolean> condition);
   }
@@ -60,6 +61,7 @@
 
   public final class FiltersKt {
     ctor public FiltersKt();
+    method public static boolean getHasClickAction(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isInMutuallyExclusiveGroup(androidx.ui.core.semantics.SemanticsConfiguration);
     method public static boolean isToggleable(androidx.ui.core.semantics.SemanticsConfiguration);
   }
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt b/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
index 08ab6eb..2da48e4 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
@@ -20,7 +20,8 @@
  * Performs a click action on the given component.
  */
 fun SemanticsNodeInteraction.doClick(): SemanticsNodeInteraction {
-    assertStillExists()
+    // TODO(b/129400818): uncomment this after Merge Semantics is merged
+    // assertHasClickAction()
 
     // TODO(catalintudor): get real coordinates after Semantics API is ready (b/125702443)
     val globalCoordinates = semanticsTreeNode.globalPosition
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt b/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt
index 7f0debd..e417c4d3 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Assertions.kt
@@ -62,15 +62,6 @@
 }
 
 /**
- * Asserts that the component is still part of the component tree.
- */
-fun SemanticsNodeInteraction.assertStillExists() {
-    if (!semanticsTreeInteraction.contains(semanticsTreeNode.data)) {
-        throw AssertionError("Assert failed: The component does not exist!")
-    }
-}
-
-/**
  * Asserts that the component isn't part of the component tree anymore. If the component exists but
  * is hidden use [assertIsHidden] instead.
  */
@@ -86,10 +77,9 @@
  * Throws [AssertionError] if the component is not unchecked, indeterminate, or not toggleable.
  */
 fun SemanticsNodeInteraction.assertIsChecked(): SemanticsNodeInteraction {
+    assertIsToggleable()
     verify({ "Component is toggled off, expected it to be toggled on" }) {
-        it.getOrElse(FoundationSemanticsProperties.ToggleableState) {
-            throw AssertionError("Component is not toggleable")
-        } == ToggleableState.Checked
+        it[FoundationSemanticsProperties.ToggleableState] == ToggleableState.Checked
     }
     return this
 }
@@ -100,10 +90,9 @@
  * Throws [AssertionError] if the component is checked, indeterminate, or not toggleable.
  */
 fun SemanticsNodeInteraction.assertIsUnchecked(): SemanticsNodeInteraction {
+    assertIsToggleable()
     verify({ "Component is toggled on, expected it to be toggled off" }) {
-        it.getOrElse(FoundationSemanticsProperties.ToggleableState) {
-            throw AssertionError("Component is not toggleable")
-        } == ToggleableState.Unchecked
+        it[FoundationSemanticsProperties.ToggleableState] == ToggleableState.Unchecked
     }
 
     return this
@@ -115,10 +104,10 @@
  * Throws [AssertionError] if the component is unselected or not selectable.
  */
 fun SemanticsNodeInteraction.assertIsSelected(): SemanticsNodeInteraction {
+    assertIsSelectable()
+
     verify({ "Component is unselected, expected it to be selected" }) {
-        it.getOrElse(FoundationSemanticsProperties.Selected) {
-            throw AssertionError("Component is not selectable")
-        }
+        it[FoundationSemanticsProperties.Selected]
     }
     return this
 }
@@ -129,10 +118,10 @@
  * Throws [AssertionError] if the component is selected or not selectable.
  */
 fun SemanticsNodeInteraction.assertIsUnselected(): SemanticsNodeInteraction {
+    assertIsSelectable()
+
     verify({ "Component is selected, expected it to be unselected" }) {
-        !it.getOrElse(FoundationSemanticsProperties.Selected) {
-            throw AssertionError("Component is not selectable")
-        }
+        !it[FoundationSemanticsProperties.Selected]
     }
     return this
 }
@@ -173,14 +162,40 @@
 fun SemanticsNodeInteraction.assertSemanticsIsEqualTo(
     expectedProperties: SemanticsConfiguration
 ): SemanticsNodeInteraction {
-    assertStillExists()
+    assertExists()
     semanticsTreeNode.data.assertEquals(expectedProperties)
 
     return this
 }
 
 /**
- * Asserts that given a list of components, it's size is equal to the passed in size.
+ * Asserts that the current component has a click action.
+ *
+ * Throws [AssertionError] if the component is doesn't have a click action.
+ */
+fun SemanticsNodeInteraction.assertHasClickAction(): SemanticsNodeInteraction {
+    verify({ "Component is not clickable, expected it to be clickable" }) {
+        it.hasClickAction
+    }
+
+    return this
+}
+
+/**
+ * Asserts that the current component doesn't have a click action.
+ *
+ * Throws [AssertionError] if the component has a click action.
+ */
+fun SemanticsNodeInteraction.assertHasNoClickAction(): SemanticsNodeInteraction {
+    verify({ "Component is clickable, expected it to not be clickable" }) {
+        !it.hasClickAction
+    }
+
+    return this
+}
+
+/**
+ * Asserts that given a list of components, its size is equal to the passed in size.
  */
 fun List<SemanticsNodeInteraction>.assertCountEquals(
     count: Int
@@ -201,10 +216,45 @@
     assertionMessage: (SemanticsConfiguration) -> String,
     condition: (SemanticsConfiguration) -> Boolean
 ) {
-    assertStillExists()
+    assertExists()
 
     if (!condition.invoke(semanticsTreeNode.data)) {
         // TODO(b/133217292)
         throw AssertionError("Assert failed: ${assertionMessage(semanticsTreeNode.data)}")
     }
 }
+
+/**
+ * Asserts that the component is still part of the component tree.
+ */
+internal fun SemanticsNodeInteraction.assertExists() {
+    if (!semanticsTreeInteraction.contains(semanticsTreeNode.data)) {
+        throw AssertionError("The component does not exist!")
+    }
+}
+
+/**
+ * Asserts that the current component is toggleable.
+ *
+ * Throws [AssertionError] if the component is not toggleable.
+ */
+internal fun SemanticsNodeInteraction.assertIsToggleable(): SemanticsNodeInteraction {
+    verify({ "Component is not toggleable, expected it to be toggleable" }) {
+        it.isToggleable
+    }
+
+    return this
+}
+
+/**
+ * Asserts that the current component is selectable.
+ *
+ * Throws [AssertionError] if the component is not selectable.
+ */
+internal fun SemanticsNodeInteraction.assertIsSelectable(): SemanticsNodeInteraction {
+    verify({ "Component is not selectable, expected it to be selectable" }) {
+        it.getOrNull(FoundationSemanticsProperties.Selected) != null
+    }
+
+    return this
+}
\ No newline at end of file
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt b/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
index 3f3d8cb..3827927 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
@@ -19,6 +19,7 @@
 import androidx.ui.core.semantics.SemanticsConfiguration
 import androidx.ui.core.semantics.getOrNull
 import androidx.ui.foundation.semantics.FoundationSemanticsProperties
+import androidx.ui.semantics.SemanticsActions
 
 /**
  * Verifies that a component is checkable.
@@ -26,6 +27,9 @@
 val SemanticsConfiguration.isToggleable: Boolean
     get() = contains(FoundationSemanticsProperties.ToggleableState)
 
+val SemanticsConfiguration.hasClickAction: Boolean
+    get() = SemanticsActions.OnClick in this
+
 // TODO(ryanmentley/pavlis): Do we want these convenience functions?
 /**
  * Verifies that a component is in a mutually exclusive group - that is,
diff --git a/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt b/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt
index deb6f9c..c487f67 100644
--- a/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt
+++ b/ui/ui-test/src/test/java/androidx/ui/test/FindersTests.kt
@@ -25,10 +25,9 @@
 import com.google.common.truth.Truth
 import org.junit.Test
 
-// TODO(b/138167927): findByTag_* tests do not call findByTag
 class FindersTests {
     @Test
-    fun findByTag_zeroOutOfOne_findsNone() {
+    fun findAll_zeroOutOfOne_findsNone() {
         semanticsTreeInteractionFactory = { selector ->
             FakeSemanticsTreeInteraction(selector)
                 .withSemantics(newNode(
@@ -43,7 +42,7 @@
     }
 
     @Test
-    fun findByTag_oneOutOfTwo_findsOne() {
+    fun findAll_oneOutOfTwo_findsOne() {
         val node1 = newNode(SemanticsConfiguration().apply {
             testTag = "myTestTag"
         })
@@ -61,7 +60,7 @@
     }
 
     @Test
-    fun findByTag_twoOutOfTwo_findsTwo() {
+    fun findAll_twoOutOfTwo_findsTwo() {
         val node1 = newNode(
             SemanticsConfiguration().apply {
                 testTag = "myTestTag"
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
index 4ada2e9..2c0ffe6 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/TextDelegateIntegrationTest.kt
@@ -56,9 +56,9 @@
 //    @Test
 //    fun preferredLineHeight_style_not_set() {
 //        val defaultTextStyle = TextStyle(fontFamily = fontFamily)
-//        val textPainter = TextDelegate(style = defaultTextStyle)
+//        val textDelegate = TextDelegate(style = defaultTextStyle)
 //
-//        val prefferedHeight = textPainter.preferredLineHeight
+//        val prefferedHeight = textDelegate.preferredLineHeight
 //
 //        assertThat(prefferedHeight).isEqualTo(14.0)
 //    }
@@ -72,16 +72,16 @@
             text = text,
             textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
         )
-        val textPainter = TextDelegate(
+        val textDelegate = TextDelegate(
             text = annotatedString,
             paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
             density = density,
             resourceLoader = resourceLoader
         )
 
-        textPainter.layout(Constraints())
+        textDelegate.layout(Constraints())
 
-        assertThat(textPainter.minIntrinsicWidth).isEqualTo(0.0f)
+        assertThat(textDelegate.minIntrinsicWidth).isEqualTo(0.0f)
     }
 
     @Test
@@ -100,16 +100,18 @@
                     )
                 )
             )
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
                 density = density,
                 resourceLoader = resourceLoader
             )
 
-            textPainter.layout(Constraints())
+            textDelegate.layout(Constraints())
 
-            assertThat(textPainter.maxIntrinsicWidth).isEqualTo(fontSize.toPx().value * text.length)
+            assertThat(
+                textDelegate.maxIntrinsicWidth).isEqualTo(fontSize.toPx().value * text.length
+            )
         }
     }
 
@@ -129,16 +131,16 @@
                     )
                 )
             )
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
                 density = density,
                 resourceLoader = resourceLoader
             )
 
-            textPainter.layout(Constraints(0.ipx, 200.ipx))
+            textDelegate.layout(Constraints(0.ipx, 200.ipx))
 
-            assertThat(textPainter.width).isEqualTo(fontSize.toPx().value * text.length)
+            assertThat(textDelegate.width).isEqualTo(fontSize.toPx().value * text.length)
         }
     }
 
@@ -151,16 +153,16 @@
             text = text,
             textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
         )
-        val textPainter = TextDelegate(
+        val textDelegate = TextDelegate(
             text = annotatedString,
             paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
             density = density,
             resourceLoader = resourceLoader
         )
 
-        textPainter.layout(Constraints(maxWidth = width))
+        textDelegate.layout(Constraints(maxWidth = width))
 
-        assertThat(textPainter.width).isEqualTo(width.value.toFloat())
+        assertThat(textDelegate.width).isEqualTo(width.value.toFloat())
     }
 
     @Test
@@ -179,31 +181,31 @@
                     )
                 )
             )
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Rtl),
                 density = density,
                 resourceLoader = resourceLoader
             )
 
-            textPainter.layout(Constraints())
+            textDelegate.layout(Constraints())
 
-            assertThat(textPainter.height).isEqualTo(fontSize.toPx().value)
+            assertThat(textDelegate.height).isEqualTo(fontSize.toPx().value)
         }
     }
 
     @Test
     fun layout_build_layoutResult() {
-        val textPainter = TextDelegate(
+        val textDelegate = TextDelegate(
             text = AnnotatedString(text = "Hello"),
             paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
             density = density,
             resourceLoader = resourceLoader
         )
 
-        textPainter.layout(Constraints(0.ipx, 20.ipx))
+        textDelegate.layout(Constraints(0.ipx, 20.ipx))
 
-        assertThat(textPainter.layoutResult).isNotNull()
+        assertThat(textDelegate.layoutResult).isNotNull()
     }
 
     @Test
@@ -219,15 +221,15 @@
                 )
             )
         )
-        val textPainter = TextDelegate(
+        val textDelegate = TextDelegate(
             text = annotatedString,
             paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
             density = density,
             resourceLoader = resourceLoader
         )
-        textPainter.layout(Constraints())
+        textDelegate.layout(Constraints())
 
-        val selection = textPainter.getOffsetForPosition(PxPosition.Origin)
+        val selection = textDelegate.getOffsetForPosition(PxPosition.Origin)
 
         assertThat(selection).isEqualTo(0)
     }
@@ -248,15 +250,15 @@
                     )
                 )
             )
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
                 density = density,
                 resourceLoader = resourceLoader
             )
-            textPainter.layout(Constraints())
+            textDelegate.layout(Constraints())
 
-            val selection = textPainter.getOffsetForPosition(
+            val selection = textDelegate.getOffsetForPosition(
                 position = PxPosition((fontSize.toPx().value * characterIndex + 1).px, 0.px)
             )
 
@@ -272,16 +274,16 @@
             text = text,
             textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
         )
-        val textPainter = TextDelegate(
+        val textDelegate = TextDelegate(
             text = annotatedString,
             paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
             density = density,
             resourceLoader = resourceLoader
         )
 
-        textPainter.layout(Constraints())
+        textDelegate.layout(Constraints())
 
-        assertThat(textPainter.hasVisualOverflow).isFalse()
+        assertThat(textDelegate.hasVisualOverflow).isFalse()
     }
 
     @Test
@@ -295,7 +297,7 @@
             text = text,
             textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
         )
-        val textPainter = TextDelegate(
+        val textDelegate = TextDelegate(
             text = annotatedString,
             paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
             overflow = TextOverflow.Fade,
@@ -305,9 +307,9 @@
             resourceLoader = resourceLoader
         )
 
-        textPainter.layout(Constraints(maxWidth = 100.ipx))
+        textDelegate.layout(Constraints(maxWidth = 100.ipx))
 
-        assertThat(textPainter.hasVisualOverflow).isTrue()
+        assertThat(textDelegate.hasVisualOverflow).isTrue()
     }
 
     @Test
@@ -321,7 +323,7 @@
             text = text,
             textStyles = listOf(AnnotatedString.Item(textStyle, 0, text.length))
         )
-        val textPainter = TextDelegate(
+        val textDelegate = TextDelegate(
             text = annotatedString,
             paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
             overflow = TextOverflow.Fade,
@@ -330,9 +332,9 @@
             resourceLoader = resourceLoader
         )
 
-        textPainter.layout(Constraints(maxWidth = 100.ipx))
+        textDelegate.layout(Constraints(maxWidth = 100.ipx))
 
-        assertThat(textPainter.hasVisualOverflow).isTrue()
+        assertThat(textDelegate.hasVisualOverflow).isTrue()
     }
 
     @Test
@@ -353,17 +355,17 @@
                     )
                 )
             )
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
                 density = density,
                 resourceLoader = resourceLoader
             )
-            textPainter.layout(Constraints(maxWidth = 120.ipx))
+            textDelegate.layout(Constraints(maxWidth = 120.ipx))
 
             val expectedBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val expectedCanvas =
@@ -372,10 +374,10 @@
             val defaultSelectionColor = Color(0x6633B5E5)
             expectedPaint.color = defaultSelectionColor
 
-            val firstLineLeft = textPainter.layoutResult?.multiParagraph?.getLineLeft(0)
-            val secondLineLeft = textPainter.layoutResult?.multiParagraph?.getLineLeft(1)
-            val firstLineRight = textPainter.layoutResult?.multiParagraph?.getLineRight(0)
-            val secondLineRight = textPainter.layoutResult?.multiParagraph?.getLineRight(1)
+            val firstLineLeft = textDelegate.layoutResult?.multiParagraph?.getLineLeft(0)
+            val secondLineLeft = textDelegate.layoutResult?.multiParagraph?.getLineLeft(1)
+            val firstLineRight = textDelegate.layoutResult?.multiParagraph?.getLineRight(0)
+            val secondLineRight = textDelegate.layoutResult?.multiParagraph?.getLineRight(1)
             expectedCanvas.drawRect(
                 Rect(firstLineLeft!!, 0f, firstLineRight!!, fontSizeInPx),
                 expectedPaint
@@ -385,21 +387,21 @@
                     secondLineLeft!!,
                     fontSizeInPx,
                     secondLineRight!!,
-                    textPainter.layoutResult!!.multiParagraph.height
+                    textDelegate.layoutResult!!.multiParagraph.height
                 ),
                 expectedPaint
             )
 
             val actualBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
 
             // Run.
             // Select all.
-            textPainter.paintBackground(
+            textDelegate.paintBackground(
                 start = 0,
                 end = text.length,
                 color = defaultSelectionColor,
@@ -431,17 +433,17 @@
                     )
                 )
             )
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
                 density = density,
                 resourceLoader = resourceLoader
             )
-            textPainter.layout(Constraints())
+            textDelegate.layout(Constraints())
 
             val expectedBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val expectedCanvas =
@@ -460,14 +462,14 @@
             )
 
             val actualBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
 
             // Run.
-            textPainter.paintBackground(
+            textDelegate.paintBackground(
                 start = selectionStart,
                 end = selectionEnd,
                 color = defaultSelectionColor,
@@ -502,17 +504,17 @@
                     )
                 )
             )
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
                 density = density,
                 resourceLoader = resourceLoader
             )
-            textPainter.layout(Constraints())
+            textDelegate.layout(Constraints())
 
             val expectedBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val expectedCanvas =
@@ -543,14 +545,14 @@
             )
 
             val actualBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
 
             // Run.
-            textPainter.paintBackground(
+            textDelegate.paintBackground(
                 start = selectionLTRStart,
                 end = textLTR.length + selectionRTLEnd,
                 color = defaultSelectionColor,
@@ -583,17 +585,17 @@
                 )
             )
             val selectionColor = Color(0x66AABB33)
-            val textPainter = TextDelegate(
+            val textDelegate = TextDelegate(
                 text = annotatedString,
                 paragraphStyle = ParagraphStyle(textDirection = TextDirection.Ltr),
                 density = density,
                 resourceLoader = resourceLoader
             )
-            textPainter.layout(Constraints())
+            textDelegate.layout(Constraints())
 
             val expectedBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val expectedCanvas =
@@ -611,14 +613,14 @@
             )
 
             val actualBitmap = Bitmap.createBitmap(
-                ceil(textPainter.width).toInt(),
-                ceil(textPainter.height).toInt(),
+                ceil(textDelegate.width).toInt(),
+                ceil(textDelegate.height).toInt(),
                 Bitmap.Config.ARGB_8888
             )
             val actualCanvas = Canvas(android.graphics.Canvas(actualBitmap))
 
             // Run.
-            textPainter.paintBackground(
+            textDelegate.paintBackground(
                 start = selectionStart,
                 end = selectionEnd,
                 color = selectionColor,
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt b/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
index 48e7883..1287346 100644
--- a/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
@@ -50,7 +50,7 @@
 private val DefaultFontSize: Sp = 14.sp
 
 /**
- * Resolve text style to be able to pass underlying paragraphs.
+ * Resolve text style to be able to pass to underlying paragraphs.
  *
  * We need to pass non-null font size to underlying paragraph.
  */
@@ -143,7 +143,7 @@
     /**
      * The paragraph style.
      *
-     * If null is passed to constructor, use default paragraph style is used.
+     * If null is passed to constructor, use default paragraph style.
      */
     val paragraphStyle: ParagraphStyle = paragraphStyle ?: ParagraphStyle()
 
diff --git a/viewpager/build.gradle b/viewpager/build.gradle
index 2559de8..f1f7e65 100644
--- a/viewpager/build.gradle
+++ b/viewpager/build.gradle
@@ -17,7 +17,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     api(project(":customview"))
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/viewpager2/build.gradle b/viewpager2/build.gradle
index 9c933df..6cda3c8 100644
--- a/viewpager2/build.gradle
+++ b/viewpager2/build.gradle
@@ -27,9 +27,9 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    implementation("androidx.core:core:1.1.0-rc01")
+    implementation("androidx.core:core:1.1.0")
     api("androidx.fragment:fragment:1.1.0-rc01")
-    api("androidx.recyclerview:recyclerview:1.1.0-beta01")
+    api(project(":recyclerview:recyclerview"))
     implementation("androidx.collection:collection:1.1.0")
 
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/webkit/build.gradle b/webkit/build.gradle
index 8c0c18d..622bf29 100644
--- a/webkit/build.gradle
+++ b/webkit/build.gradle
@@ -26,7 +26,7 @@
 
 dependencies {
     api("androidx.annotation:annotation:1.1.0")
-    api("androidx.core:core:1.1.0-rc01")
+    api("androidx.core:core:1.1.0")
 
     androidTestImplementation(OKHTTP_MOCKWEBSERVER)
     androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java b/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java
index 72dae3d..8e2d65f 100644
--- a/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java
+++ b/webkit/src/main/java/androidx/webkit/internal/AssetHelper.java
@@ -34,7 +34,8 @@
 import java.util.zip.GZIPInputStream;
 
 /**
-  * Handles opening resources and assets.
+  * A Utility class for opening resources, assets and files for
+  * {@link androidx.webkit.WebViewAssetLoader}.
   * Forked from the chromuim project org.chromium.android_webview.AndroidProtocolHandler
   */
 public class AssetHelper {
@@ -73,9 +74,9 @@
         return path;
     }
 
-    private int getFieldId(@NonNull String assetType, @NonNull String assetName) {
+    private int getFieldId(@NonNull String resourceType, @NonNull String resourceName) {
         String packageName = mContext.getPackageName();
-        int id = mContext.getResources().getIdentifier(assetName, assetType, packageName);
+        int id = mContext.getResources().getIdentifier(resourceName, resourceType, packageName);
         return id;
     }
 
@@ -89,29 +90,32 @@
      * Open an InputStream for an Android resource.
      *
      * @param path Path of the form "resource_type/resource_name.ext".
-     * @return An InputStream to the Android resource.
+     * @return An {@link InputStream} to the Android resource or {@code null} if it cannot open the
+     *         resource file.
      */
     @Nullable
     public InputStream openResource(@NonNull String path) {
         path = removeLeadingSlash(path);
-        // The path must be of the form "asset_type/asset_name.ext".
+        // The path must be of the form "resource_type/resource_name.ext".
         String[] pathSegments = path.split("/");
         if (pathSegments.length != 2) {
             Log.e(TAG, "Incorrect resource path: " + path);
             return null;
         }
-        String assetType = pathSegments[0];
-        String assetName = pathSegments[1];
+        String resourceType = pathSegments[0];
+        String resourceName = pathSegments[1];
 
         // Drop the file extension.
-        assetName = assetName.split("\\.")[0];
+        resourceName = resourceName.split("\\.")[0];
         try {
-            int fieldId = getFieldId(assetType, assetName);
+            int fieldId = getFieldId(resourceType, resourceName);
             int valueType = getValueType(fieldId);
             if (valueType == TypedValue.TYPE_STRING) {
                 return handleSvgzStream(path, mContext.getResources().openRawResource(fieldId));
             } else {
-                Log.e(TAG, "Asset not of type string: " + path);
+                Log.e(TAG,
+                        String.format("Expected %s resource to be of TYPE_STRING but was %d",
+                                path, valueType));
                 return null;
             }
         } catch (Resources.NotFoundException e) {
@@ -124,7 +128,8 @@
      * Open an InputStream for an Android asset.
      *
      * @param path Path to the asset file to load.
-     * @return An InputStream to the Android asset.
+     * @return An {@link InputStream} to the Android asset or {@code null} if it cannot open the
+     *         asset file.
      */
     @Nullable
     public InputStream openAsset(@NonNull String path) {
@@ -141,7 +146,7 @@
     /**
      * Open an {@code InputStream} for a file in application data directories.
      *
-     * @param file The the file to be opened.
+     * @param file The file to be opened.
      * @return An {@code InputStream} for the requested file or {@code null} if an error happens.
      */
     @Nullable