Merge "Adding sunnygoyal to the owners for slices" into androidx-master-dev
diff --git a/annotations/src/main/java/androidx/annotation/ContentView.java b/annotations/src/main/java/androidx/annotation/ContentView.java
index 407763a..eee0d2f 100644
--- a/annotations/src/main/java/androidx/annotation/ContentView.java
+++ b/annotations/src/main/java/androidx/annotation/ContentView.java
@@ -25,7 +25,7 @@
 
 /**
  * Annotation that can be attached to a component such as an
- * {@link androidx.activity.ComponentActivity} or {@link androidx.fragment.app.Fragment}
+ * androidx.activity.ComponentActivity or {@link androidx.fragment.app.Fragment}
  * to denote what layout the component intends to inflate and set as its content.
  * <p>
  * This annotation is marked as {@link Inherited} and will therefore apply to subclasses
diff --git a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java
index 03e3203..f57aace 100644
--- a/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java
+++ b/appcompat/resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java
@@ -85,7 +85,6 @@
  * {@link android.R.attr#state_middle}
  * {@link android.R.attr#state_last}
  * {@link android.R.attr#state_pressed}
- * @see ResourceManagerInternal#getDrawable(Context, int)
  */
 @SuppressLint("RestrictedAPI") // Temporary until we have correct restriction scopes for 1.0
 public class AnimatedStateListDrawableCompat extends StateListDrawable
@@ -129,7 +128,6 @@
      * @param resId the resource ID for AnimatedStateListDrawable object.
      * @param theme the theme to apply, may be null.
      * @return a new AnimatedStateListDrawableCompat or null if parsing error is found.
-     * @see ResourceManagerInternal#getDrawable(Context, int)
      */
     @Nullable
     public static AnimatedStateListDrawableCompat create(
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
index 92b0c67..f0a8452 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
@@ -30,6 +30,7 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
+import androidx.appcompat.R;
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.widget.ImageViewCompat;
 import androidx.core.widget.TintableImageSourceView;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java b/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
index 364f2cb..98d9795 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
@@ -434,7 +434,7 @@
      * @see TextView#setImeOptions(int)
      * @param imeOptions the options to set on the query text field
      *
-     * {@link androidx.appcompat.R.attr#android_imeOptions}
+     * {@link android.R.attr#imeOptions}
      */
     public void setImeOptions(int imeOptions) {
         mSearchSrcTextView.setImeOptions(imeOptions);
@@ -445,7 +445,7 @@
      * @return the ime options
      * @see TextView#setImeOptions(int)
      *
-     * {@link androidx.appcompat.R.attr#android_imeOptions}
+     * {@link android.R.attr#imeOptions}
      */
     public int getImeOptions() {
         return mSearchSrcTextView.getImeOptions();
@@ -457,7 +457,7 @@
      * @see TextView#setInputType(int)
      * @param inputType the input type to set on the query text field
      *
-     * {@link androidx.appcompat.R.attr#android_inputType}
+     * {@link android.R.attr#inputType}
      */
     public void setInputType(int inputType) {
         mSearchSrcTextView.setInputType(inputType);
@@ -467,7 +467,7 @@
      * Returns the input type set on the query text field.
      * @return the input type
      *
-     * {@link androidx.appcompat.R.attr#android_inputType}
+     * {@link android.R.attr#inputType}
      */
     public int getInputType() {
         return mSearchSrcTextView.getInputType();
@@ -757,7 +757,7 @@
     /**
      * Makes the view at most this many pixels wide
      *
-     * {@link androidx.appcompat.R.attr#android_maxWidth}
+     * {@link android.R.attr#maxWidth}
      */
     public void setMaxWidth(int maxpixels) {
         mMaxWidth = maxpixels;
@@ -770,7 +770,7 @@
      * no maximum width was specified.
      * @return the maximum width of the view
      *
-     * {@link androidx.appcompat.R.attr#android_maxWidth}
+     * {@link android.R.attr#maxWidth}
      */
     public int getMaxWidth() {
         return mMaxWidth;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java b/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
index 5449de0..f6964a2 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
@@ -73,12 +73,12 @@
  * <p>See the <a href="{@docRoot}guide/topics/ui/controls/togglebutton.html">Toggle Buttons</a>
  * guide.</p>
  *
- * {@link androidx.appcompat.R.attr#android_textOn}
- * {@link androidx.appcompat.R.attr#android_textOff}
+ * {@link android.R.attr#textOn}
+ * {@link android.R.attr#textOff}
  * {@link androidx.appcompat.R.attr#switchMinWidth}
  * {@link androidx.appcompat.R.attr#switchPadding}
  * {@link androidx.appcompat.R.attr#switchTextAppearance}
- * {@link androidx.appcompat.R.attr#android_thumb}
+ * {@link android.R.attr#thumb}
  * {@link androidx.appcompat.R.attr#thumbTextPadding}
  * {@link androidx.appcompat.R.attr#track}
  */
@@ -597,7 +597,7 @@
      *
      * @param thumb Thumb drawable
      *
-     * {@link androidx.appcompat.R.attr#android_thumb}
+     * {@link android.R.attr#thumb}
      */
     public void setThumbDrawable(Drawable thumb) {
         if (mThumbDrawable != null) {
@@ -616,7 +616,7 @@
      *
      * @param resId Resource ID of a thumb drawable
      *
-     * {@link androidx.appcompat.R.attr#android_thumb}
+     * {@link android.R.attr#thumb}
      */
     public void setThumbResource(int resId) {
         setThumbDrawable(AppCompatResources.getDrawable(getContext(), resId));
@@ -628,7 +628,7 @@
      *
      * @return Thumb drawable
      *
-     * {@link androidx.appcompat.R.attr#android_thumb}
+     * {@link android.R.attr#thumb}
      */
     public Drawable getThumbDrawable() {
         return mThumbDrawable;
@@ -740,7 +740,7 @@
     /**
      * Returns the text displayed when the button is in the checked state.
      *
-     * {@link androidx.appcompat.R.attr#android_textOn}
+     * {@link android.R.attr#textOn}
      */
     public CharSequence getTextOn() {
         return mTextOn;
@@ -749,7 +749,7 @@
     /**
      * Sets the text displayed when the button is in the checked state.
      *
-     * {@link androidx.appcompat.R.attr#android_textOn}
+     * {@link android.R.attr#textOn}
      */
     public void setTextOn(CharSequence textOn) {
         mTextOn = textOn;
@@ -759,7 +759,7 @@
     /**
      * Returns the text displayed when the button is not in the checked state.
      *
-     * {@link androidx.appcompat.R.attr#android_textOff}
+     * {@link android.R.attr#textOff}
      */
     public CharSequence getTextOff() {
         return mTextOff;
@@ -768,7 +768,7 @@
     /**
      * Sets the text displayed when the button is not in the checked state.
      *
-     * {@link androidx.appcompat.R.attr#android_textOff}
+     * {@link android.R.attr#textOff}
      */
     public void setTextOff(CharSequence textOff) {
         mTextOff = textOff;
diff --git a/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java b/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
index 2754164..9b4a11d 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
@@ -122,7 +122,7 @@
  * {@link androidx.appcompat.R.attr#contentInsetStart}
  * {@link androidx.appcompat.R.attr#contentInsetStartWithNavigation}
  * {@link androidx.appcompat.R.attr#contentInsetEndWithActions}
- * {@link androidx.appcompat.R.attr#android_gravity}
+ * {@link android.R.attr#gravity}
  * {@link androidx.appcompat.R.attr#logo}
  * {@link androidx.appcompat.R.attr#logoDescription}
  * {@link androidx.appcompat.R.attr#maxButtonHeight}
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
index 7cb492f..a7161ce 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsClient.java
@@ -79,7 +79,7 @@
     /**
      * Returns the preferred package to use for Custom Tabs, preferring the default VIEW handler.
      *
-     * @see #getPackageName(Context, List<String>, boolean)
+     * see getPackageName(Context, List<String>, boolean)
      */
     public static String getPackageName(Context context, @Nullable List<String> packages) {
         return getPackageName(context, packages, false);
diff --git a/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
index 224130c..dd9b494 100644
--- a/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
@@ -20,7 +20,6 @@
 import androidx.build.Strategy.TipOfTree
 import androidx.build.checkapi.ApiXmlConversionTask
 import androidx.build.checkapi.CheckApiTasks
-import androidx.build.checkapi.hasApiTasks
 import androidx.build.checkapi.initializeApiChecksForProject
 import androidx.build.doclava.ChecksConfig
 import androidx.build.doclava.DEFAULT_DOCLAVA_CONFIG
@@ -323,21 +322,6 @@
         }
 
         registerJavaProjectForDocsTask(generateDiffsTask, compileJava)
-        if (!hasApiTasks(project, extension)) {
-            return
-        }
-
-        val tasks = initializeApiChecksForProject(project,
-                aggregateOldApiTxtsTask, aggregateNewApiTxtsTask)
-        registerJavaProjectForDocsTask(tasks.generateApi, compileJava)
-        setupApiVersioningInDocsTasks(extension, tasks)
-        addCheckApiTasksToGraph(tasks)
-        registerJavaProjectForDocsTask(tasks.generateLocalDiffs, compileJava)
-        val generateApiDiffsArchiveTask = createGenerateLocalApiDiffsArchiveTask(project,
-                tasks.generateLocalDiffs)
-        generateApiDiffsArchiveTask.configure {
-            it.dependsOn(tasks.generateLocalDiffs)
-        }
     }
 
     /**
@@ -365,21 +349,6 @@
                 tipOfTreeTasks(extension) { task ->
                     registerAndroidProjectForDocsTask(task, variant)
                 }
-
-                if (!hasApiTasks(project, extension)) {
-                    return@all
-                }
-                val tasks = initializeApiChecksForProject(project, aggregateOldApiTxtsTask,
-                        aggregateNewApiTxtsTask)
-                registerAndroidProjectForDocsTask(tasks.generateApi, variant)
-                setupApiVersioningInDocsTasks(extension, tasks)
-                addCheckApiTasksToGraph(tasks)
-                registerAndroidProjectForDocsTask(tasks.generateLocalDiffs, variant)
-                val generateApiDiffsArchiveTask = createGenerateLocalApiDiffsArchiveTask(project,
-                        tasks.generateLocalDiffs)
-                generateApiDiffsArchiveTask.configure {
-                    it.dependsOn(tasks.generateLocalDiffs)
-                }
             }
         }
     }
diff --git a/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt b/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt
index 1ebba71..a07b6c9 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dokka/Dokka.kt
@@ -75,7 +75,10 @@
         library: LibraryExtension,
         extension: SupportLibraryExtension
     ) {
-        DiffAndDocs.get(project).registerPrebuilts(extension)
+        if (project.name != "docs-runner") {
+            DiffAndDocs.get(project).registerAndroidProject(project, library, extension)
+        }
+
         DokkaPublicDocs.registerProject(project, extension)
         DokkaSourceDocs.registerAndroidProject(project, library, extension)
     }
@@ -84,7 +87,9 @@
         project: Project,
         extension: SupportLibraryExtension
     ) {
-        DiffAndDocs.get(project).registerPrebuilts(extension)
+        if (project.name != "docs-runner") {
+            DiffAndDocs.get(project).registerJavaProject(project, extension)
+        }
         DokkaPublicDocs.registerProject(project, extension)
         DokkaSourceDocs.registerJavaProject(project, extension)
     }
diff --git a/docs-fake/build.gradle b/docs-fake/build.gradle
index 7b73ce0..6c7111a7 100644
--- a/docs-fake/build.gradle
+++ b/docs-fake/build.gradle
@@ -26,11 +26,11 @@
 def reentrance = false
 project.tasks.whenTaskAdded { task ->
     if (task instanceof org.gradle.api.tasks.testing.Test
-	|| task.name.startsWith("assemble")
-        || task.name == "transformDexArchiveWithExternalLibsDexMergerForPublicDebug"
-        || task.name == "transformResourcesWithMergeJavaResForPublicDebug"
-        || task.name == "checkPublicDebugDuplicateClasses") {
-	if (!reentrance) {
+            || task.name.startsWith("assemble")
+            || task.name == "transformDexArchiveWithExternalLibsDexMergerForPublicDebug"
+            || task.name == "transformResourcesWithMergeJavaResForPublicDebug"
+            || task.name == "checkPublicDebugDuplicateClasses") {
+        if (!reentrance) {
             reentrance = true
             project.tasks.replace(task.name)
             reentrance = false
diff --git a/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/src/main/java/androidx/fragment/app/Fragment.java
index b1cfc5f..6e52230 100644
--- a/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -2088,7 +2088,7 @@
      * @param transition The Transition to use to move Views out of the Scene when the Fragment
      *         is preparing to close. <code>transition</code> must be an
      *         {@link android.transition.Transition android.transition.Transition} or
-     *         {@link androidx.transition.Transition androidx.transition.Transition}.
+     *         {@link androidx.transition.Transition}.
      */
     public void setReturnTransition(@Nullable Object transition) {
         ensureAnimationInfo().mReturnTransition = transition;
diff --git a/fragment/src/main/java/androidx/fragment/app/FragmentController.java b/fragment/src/main/java/androidx/fragment/app/FragmentController.java
index 2086392..5b5e07f 100644
--- a/fragment/src/main/java/androidx/fragment/app/FragmentController.java
+++ b/fragment/src/main/java/androidx/fragment/app/FragmentController.java
@@ -312,13 +312,13 @@
      * Moves Fragments managed by the controller's FragmentManager
      * into the destroy state.
      * <p>
-     * If the {@link FragmentHostCallback} is an instance of {@link ViewModelStoreOwner},
+     * If the {@link androidx.fragment.app.FragmentHostCallback} is an instance of {@link ViewModelStoreOwner},
      * then retained Fragments and any other non configuration state such as any
      * {@link androidx.lifecycle.ViewModel} attached to Fragments will only be destroyed if
      * {@link androidx.lifecycle.ViewModelStore#clear()} is called prior to this method.
      * <p>
      * Otherwise, the FragmentManager will look to see if the
-     * {@link FragmentHostCallback#getContext() host's Context} is an {@link Activity}
+     * {@link FragmentHostCallback host's} Context is an {@link Activity}
      * and if {@link Activity#isChangingConfigurations()} returns true. In only that case
      * will non configuration state be retained.
      * <p>Call when Fragments should be destroyed.
diff --git a/fragment/testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioDialogFragmentTest.kt b/fragment/testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioDialogFragmentTest.kt
new file mode 100644
index 0000000..148cbd0
--- /dev/null
+++ b/fragment/testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioDialogFragmentTest.kt
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 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.fragment.app.testing
+
+import androidx.core.os.BuildCompat.isAtLeastQ
+import androidx.lifecycle.Lifecycle.State
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for FragmentScenario's implementation against DialogFragment.
+ */
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class FragmentScenarioDialogFragmentTest {
+    @Test
+    fun launchFragment() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.RESUMED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+            onView(withText("my button")).check(matches(isDisplayed()))
+        }
+    }
+
+    @Test
+    fun launchFragmentInContainer() {
+        with(launchFragmentInContainer<SimpleDialogFragment>()) {
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.RESUMED)
+                // We show SimpleDialogFragment in container so dialog is not created.
+                assertThat(fragment.dialog).isNull()
+            }
+            onView(withText("my button")).check(matches(isDisplayed()))
+        }
+    }
+
+    @Test
+    fun fromResumedToCreated() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.CREATED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.CREATED)
+                assertThat(fragment.dialog).isNotNull()
+                if (isAtLeastQ()) {
+                    assertThat(fragment.requireDialog().isShowing).isFalse()
+                } else {
+                    // Dialog#isShowing should've returned false but it returns true due to a
+                    // bug which was fixed by aosp/637304.
+                    assertThat(fragment.requireDialog().isShowing).isTrue()
+                }
+            }
+        }
+    }
+
+    @Test
+    fun fromResumedToStarted() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.STARTED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.STARTED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun fromResumedToResumed() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.RESUMED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.RESUMED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun fromResumedToDestroyed() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.DESTROYED)
+        }
+    }
+
+    @Test
+    fun fromCreatedToCreated() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.CREATED)
+            moveToState(State.CREATED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.CREATED)
+                assertThat(fragment.dialog).isNotNull()
+                if (isAtLeastQ()) {
+                    assertThat(fragment.requireDialog().isShowing).isFalse()
+                } else {
+                    // Dialog#isShowing should've returned false but it returns true due to a
+                    // bug which was fixed by aosp/637304.
+                    assertThat(fragment.requireDialog().isShowing).isTrue()
+                }
+            }
+        }
+    }
+
+    @Test
+    fun fromCreatedToStarted() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.CREATED)
+            moveToState(State.STARTED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.STARTED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun fromCreatedToResumed() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.CREATED)
+            moveToState(State.RESUMED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.RESUMED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun fromCreatedToDestroyed() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.CREATED)
+            moveToState(State.DESTROYED)
+        }
+    }
+
+    @Test
+    fun fromStartedToCreated() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.STARTED)
+            moveToState(State.CREATED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.CREATED)
+                assertThat(fragment.dialog).isNotNull()
+                if (isAtLeastQ()) {
+                    assertThat(fragment.requireDialog().isShowing).isFalse()
+                } else {
+                    // Dialog#isShowing should've returned false but it returns true due to a
+                    // bug which was fixed by aosp/637304.
+                    assertThat(fragment.requireDialog().isShowing).isTrue()
+                }
+            }
+        }
+    }
+
+    @Test
+    fun fromStartedToStarted() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.STARTED)
+            moveToState(State.STARTED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.STARTED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun fromStartedToResumed() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.STARTED)
+            moveToState(State.RESUMED)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.RESUMED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun fromStartedToDestroyed() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.STARTED)
+            moveToState(State.DESTROYED)
+        }
+    }
+
+    @Test
+    fun fromDestroyedToDestroyed() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            moveToState(State.DESTROYED)
+            moveToState(State.DESTROYED)
+        }
+    }
+
+    @Test
+    fun recreateCreatedFragment() {
+        var numOfInstantiation = 0
+        with(launchFragment {
+            ++numOfInstantiation
+            SimpleDialogFragment()
+        }) {
+            assertThat(numOfInstantiation).isEqualTo(1)
+            moveToState(State.CREATED)
+            recreate()
+            assertThat(numOfInstantiation).isEqualTo(2)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.CREATED)
+                assertThat(fragment.dialog).isNotNull()
+                if (isAtLeastQ()) {
+                    assertThat(fragment.requireDialog().isShowing).isFalse()
+                } else {
+                    // Dialog#isShowing should've returned false but it returns true due to a
+                    // bug which was fixed by aosp/637304.
+                    assertThat(fragment.requireDialog().isShowing).isTrue()
+                }
+            }
+        }
+    }
+
+    @Test
+    fun recreateStartedFragment() {
+        var numOfInstantiation = 0
+        with(launchFragment {
+            ++numOfInstantiation
+            SimpleDialogFragment()
+        }) {
+            assertThat(numOfInstantiation).isEqualTo(1)
+            moveToState(State.STARTED)
+            recreate()
+            assertThat(numOfInstantiation).isEqualTo(2)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.STARTED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun recreateResumedFragment() {
+        var numOfInstantiation = 0
+        with(launchFragment {
+            ++numOfInstantiation
+            SimpleDialogFragment()
+        }) {
+            assertThat(numOfInstantiation).isEqualTo(1)
+            recreate()
+            assertThat(numOfInstantiation).isEqualTo(2)
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.RESUMED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+            }
+        }
+    }
+
+    @Test
+    fun dismissDialog() {
+        with(launchFragment<SimpleDialogFragment>()) {
+            onFragment { fragment ->
+                assertThat(fragment.lifecycle.currentState).isEqualTo(State.RESUMED)
+                assertThat(fragment.dialog).isNotNull()
+                assertThat(fragment.requireDialog().isShowing).isTrue()
+                fragment.dismiss()
+                fragment.requireFragmentManager().executePendingTransactions()
+                assertThat(fragment.dialog).isNull()
+            }
+        }
+        onView(withText("my button")).check(doesNotExist())
+    }
+}
\ No newline at end of file
diff --git a/fragment/testing/src/androidTest/java/androidx/fragment/app/testing/SimpleDialogFragment.kt b/fragment/testing/src/androidTest/java/androidx/fragment/app/testing/SimpleDialogFragment.kt
new file mode 100644
index 0000000..f5bd569
--- /dev/null
+++ b/fragment/testing/src/androidTest/java/androidx/fragment/app/testing/SimpleDialogFragment.kt
@@ -0,0 +1,19 @@
+package androidx.fragment.app.testing
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.DialogFragment
+import androidx.fragment.testing.test.R
+
+/**
+ * A dialog fragment with a button to demonstrate unit testing.
+ */
+class SimpleDialogFragment : DialogFragment() {
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? = inflater.inflate(R.layout.fragment_simple_dialog, container, false)
+}
\ No newline at end of file
diff --git a/fragment/testing/src/androidTest/res/layout/fragment_simple_dialog.xml b/fragment/testing/src/androidTest/res/layout/fragment_simple_dialog.xml
new file mode 100644
index 0000000..32118ab
--- /dev/null
+++ b/fragment/testing/src/androidTest/res/layout/fragment_simple_dialog.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2019 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <Button
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="my button"/>
+</FrameLayout>
diff --git a/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java b/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java
index b5805eb..edbbc8f 100644
--- a/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java
+++ b/leanback/src/main/java/androidx/leanback/widget/StreamingTextView.java
@@ -301,7 +301,7 @@
 
     /**
      * See
-     * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
+     * {@link androidx.core.widget.TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
     public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
diff --git a/leanback/src/main/java/androidx/leanback/widget/picker/DatePicker.java b/leanback/src/main/java/androidx/leanback/widget/picker/DatePicker.java
index 4719107..48850f1 100644
--- a/leanback/src/main/java/androidx/leanback/widget/picker/DatePicker.java
+++ b/leanback/src/main/java/androidx/leanback/widget/picker/DatePicker.java
@@ -39,8 +39,8 @@
  * can be customized.  The columns can be customized by attribute "datePickerFormat" or
  * {@link #setDatePickerFormat(String)}.
  *
- * {@link R.attr#android_maxDate}
- * {@link R.attr#android_minDate}
+ * {@link android.R.attr#maxDate}
+ * {@link android.R.attr#minDate}
  * {@link R.attr#datePickerFormat}
  */
 public class DatePicker extends Picker {
@@ -522,4 +522,4 @@
             }
         });
     }
-}
\ No newline at end of file
+}
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
index de9a16a..fdb630b 100644
--- a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
+++ b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
@@ -26,9 +26,9 @@
 
 /**
  * Skeleton of androidx.lifecycle.ViewModelProvider.KeyedFactory
- * that creates {@link SavedStateHandle} for every requested {@link ViewModel}. The subclasses
+ * that creates {@link SavedStateHandle} for every requested {@link androidx.lifecycle.ViewModel}. The subclasses
  * implement {@link #create(String, Class, SavedStateHandle)} to actually instantiate
- * {@code ViewModels}.
+ * {@code androidx.lifecycle.ViewModel}s.
  */
 public abstract class AbstractSavedStateVMFactory extends ViewModelProvider.KeyedFactory {
     static final String TAG_SAVED_STATE_HANDLE_CONTROLLER = "androidx.lifecycle.savedstate.vm.tag";
@@ -41,7 +41,7 @@
      * Constructs this factory.
      *
      * @param owner {@link SavedStateRegistryOwner} that will provide restored state for created
-     * {@link ViewModel ViewModels}
+     * {@link androidx.lifecycle.ViewModel ViewModels}
      * @param defaultArgs values from this {@code Bundle} will be used as defaults by
      *                    {@link SavedStateHandle} passed in {@link ViewModel ViewModels}
      *                    if there is no previously saved state
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
index 5e7f389..edf9c8c 100644
--- a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
+++ b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
@@ -37,7 +37,7 @@
 import java.util.Set;
 
 /**
- * A handle to saved state passed down to {@link ViewModel}. You should use
+ * A handle to saved state passed down to {@link androidx.lifecycle.ViewModel}. You should use
  * {@link SavedStateVMFactory} if you want to receive this object in {@code ViewModel}'s
  * constructor.
  * <p>
@@ -45,11 +45,11 @@
  * These values will persist after the process is killed by the system
  * and remain available via the same object.
  * <p>
- * You can read a value from it via {@link #get(String)} or observe it via {@link LiveData} returned
+ * You can read a value from it via {@link #get(String)} or observe it via {@link androidx.lifecycle.LiveData} returned
  * by {@link #getLiveData(String)}.
  * <p>
  * You can write a value to it via {@link #set(String, Object)} or setting a value to
- * {@link MutableLiveData} returned by {@link #getLiveData(String)}.
+ * {@link androidx.lifecycle.MutableLiveData} returned by {@link #getLiveData(String)}.
  */
 public final class SavedStateHandle {
     final Map<String, Object> mRegular;
@@ -136,7 +136,7 @@
     }
 
     /**
-     * Returns a {@link LiveData} that access data associated with the given key,.
+     * Returns a {@link androidx.lifecycle.LiveData} that access data associated with the given key,.
      */
     @SuppressWarnings("unchecked")
     @MainThread
@@ -209,7 +209,7 @@
      * Removes a value associated with the given key. If there is a {@link LiveData} associated
      * with the given key, it will be removed as well.
      * <p>
-     * All changes to {@link LiveData} previously
+     * All changes to {@link androidx.lifecycle.LiveData} previously
      * returned by {@link SavedStateHandle#getLiveData(String)} won't be reflected in
      * the saved state. Also that {@code LiveData} won't receive any updates about new values
      * associated by the given key.
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
index bc219de..d2457ef1 100644
--- a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
+++ b/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
@@ -31,13 +31,13 @@
 import java.util.Arrays;
 
 /**
- * {@link ViewModelProvider.Factory} that can create ViewModels accessing and contributing
+ * {@link androidx.lifecycle.ViewModelProvider.Factory} that can create ViewModels accessing and contributing
  * to a saved state via {@link SavedStateHandle} received in a constructor. If {@code defaultArgs}
  * bundle was passed in {@link #SavedStateVMFactory(Fragment, Bundle)}
  * or {@link #SavedStateVMFactory(FragmentActivity, Bundle)}, it will provide default values in
  * {@code SavedStateHandle}.
  * <p>
- * If ViewModel is instance of {@link AndroidViewModel}, it looks for a constructor that
+ * If ViewModel is instance of {@link androidx.lifecycle.AndroidViewModel}, it looks for a constructor that
  * receives an {@link Application} and {@link SavedStateHandle} (in this order), otherwise
  * it looks for a constructor that receives {@link SavedStateHandle} only.
  */
@@ -48,7 +48,7 @@
     /**
      * Creates {@link SavedStateVMFactory}.
      * <p>
-     * {@link ViewModel} created with this factory can access to saved state scoped to
+     * {@link androidx.lifecycle.ViewModel} created with this factory can access to saved state scoped to
      * the given {@code fragment}.
      *
      * @param fragment scope of this fragment will be used for state saving
@@ -60,7 +60,7 @@
     /**
      * Creates {@link SavedStateVMFactory}.
      * <p>
-     * {@link ViewModel} created with this factory can access to saved state scoped to
+     * {@link androidx.lifecycle.ViewModel} created with this factory can access to saved state scoped to
      * the given {@code fragment}.
      *
      * @param fragment scope of this fragment will be used for state saving
@@ -75,7 +75,7 @@
     /**
      * Creates {@link SavedStateVMFactory}.
      * <p>
-     * {@link ViewModel} created with this factory can access to saved state scoped to
+     * {@link androidx.lifecycle.ViewModel} created with this factory can access to saved state scoped to
      * the given {@code activity}.
      *
      * @param activity scope of this activity will be used for state saving
@@ -87,7 +87,7 @@
     /**
      * Creates {@link SavedStateVMFactory}.
      * <p>
-     * {@link ViewModel} created with this factory can access to saved state scoped to
+     * {@link androidx.lifecycle.ViewModel} created with this factory can access to saved state scoped to
      * the given {@code activity}.
      *
      * @param activity scope of this activity will be used for state saving
@@ -102,12 +102,12 @@
     /**
      * Creates {@link SavedStateVMFactory}.
      * <p>
-     * {@link ViewModel} created with this factory can access to saved state scoped to
+     * {@link androidx.lifecycle.ViewModel} created with this factory can access to saved state scoped to
      * the given {@code activity}.
      *
      * @param application an application
      * @param owner {@link SavedStateRegistryOwner} that will provide restored state for created
-     * {@link ViewModel ViewModels}
+     * {@link androidx.lifecycle.ViewModel ViewModels}
      * @param defaultArgs values from this {@code Bundle} will be used as defaults by
      * {@link SavedStateHandle} if there is no previously saved state or previously saved state
      * misses a value by such key.
diff --git a/media/src/main/java/androidx/media/MediaSessionManager.java b/media/src/main/java/androidx/media/MediaSessionManager.java
index c8acdae..c75c47d 100644
--- a/media/src/main/java/androidx/media/MediaSessionManager.java
+++ b/media/src/main/java/androidx/media/MediaSessionManager.java
@@ -204,7 +204,7 @@
          * met:
          * <ol>
          * <li>UID and package name are the same</li>
-         * <li>One of the RemoteUserInfo's PID is {@link #UNKNOWN_PID} or both of RemoteUserInfo's
+         * <li>One of the RemoteUserInfo's PID is UNKNOWN_PID or both of RemoteUserInfo's
          *     PID are the same</li>
          * </ol>
          *
diff --git a/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java b/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
index 4d3323b..34a1833 100644
--- a/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
+++ b/media2-widget/src/main/java/androidx/media2/widget/MediaControlView.java
@@ -189,8 +189,8 @@
     long mNextSeekPosition;
     boolean mDragging;
     boolean mIsFullScreen;
+    boolean mIsShowingReplayButton;
     boolean mOverflowIsShowing;
-    boolean mIsStopped;
     boolean mSeekAvailable;
     boolean mIsAdvertisement;
     boolean mNeedToHideBars;
@@ -919,7 +919,7 @@
             playPauseButton.setContentDescription(
                     mResources.getString(R.string.mcv2_play_button_desc));
         } else {
-            if (mIsStopped) {
+            if (mIsShowingReplayButton) {
                 mController.seekTo(0);
             }
             mController.play();
@@ -1034,8 +1034,8 @@
 
             // Check if playback is currently stopped. In this case, update the pause button to
             // show the play image instead of the replay image.
-            if (mIsStopped) {
-                updateForStoppedState(false);
+            if (mIsShowingReplayButton) {
+                updateReplayButton(false);
             }
 
             if (isCurrentMediaItemFromNetwork() && mController.isPlaying()) {
@@ -1101,14 +1101,13 @@
             resetHideCallbacks();
             removeCallbacks(mUpdateProgress);
 
-            // If the media is currently stopped, rewinding will start the media from the
-            // beginning. Instead, seek to 10 seconds before the end of the media.
-            boolean stoppedWithDuration = mIsStopped && mDuration != 0;
+            // If replay button is shown, seek to 10 seconds before the end of the media.
+            boolean stoppedWithDuration = mIsShowingReplayButton && mDuration != 0;
             long currentPosition = stoppedWithDuration ? mDuration : getLatestSeekPosition();
             long seekPosition = Math.max(currentPosition - REWIND_TIME_MS, 0);
             seekTo(seekPosition, /* shouldSeekNow= */ true);
             if (stoppedWithDuration) {
-                updateForStoppedState(/* isStopped= */ false);
+                updateReplayButton(/* toBeShown */ false);
             }
         }
     };
@@ -1121,11 +1120,12 @@
 
             long latestSeekPosition = getLatestSeekPosition();
             seekTo(Math.min(latestSeekPosition + FORWARD_TIME_MS, mDuration), true);
-            if (latestSeekPosition + FORWARD_TIME_MS >= mDuration) {
-                // If the media is currently paused, fast-forwarding beyond the duration value will
-                // not return a callback that updates the play/pause and ffwd buttons. Thus,
-                // update the buttons manually here.
-                updateForStoppedState(true);
+
+            // Note: In some edge cases, mDuration might be less than actual duration of
+            // the stream. If controller is in playing state, it should not show replay
+            // button even when the seekPosition >= mDuration.
+            if (latestSeekPosition + FORWARD_TIME_MS >= mDuration && !mController.isPlaying()) {
+                updateReplayButton(/* toBeShown */ true);
             }
         }
     };
@@ -1366,9 +1366,9 @@
                 break;
         }
 
-        // Update play/pause and ffwd buttons based on whether the media is currently stopped or
-        // not.
-        updateForStoppedState(mIsStopped);
+        // Update play/pause and ffwd buttons based on whether currently the replay button is shown
+        // or not.
+        updateReplayButton(mIsShowingReplayButton);
     }
 
     private View initTransportControls(int id) {
@@ -1624,11 +1624,11 @@
         mSubSettingsAdapter.setCheckPosition(mSelectedSpeedIndex);
     }
 
-    void updateForStoppedState(boolean isStopped) {
+    void updateReplayButton(boolean toBeShown) {
         ImageButton playPauseButton = findControlButton(mSizeType, R.id.pause);
         ImageButton ffwdButton = findControlButton(mSizeType, R.id.ffwd);
-        if (isStopped) {
-            mIsStopped = true;
+        if (toBeShown) {
+            mIsShowingReplayButton = true;
             if (playPauseButton != null) {
                 playPauseButton.setImageDrawable(
                         mResources.getDrawable(R.drawable.ic_replay_circle_filled));
@@ -1640,7 +1640,7 @@
                 ffwdButton.setEnabled(false);
             }
         } else {
-            mIsStopped = false;
+            mIsShowingReplayButton = false;
             if (playPauseButton != null) {
                 if (mController.isPlaying()) {
                     playPauseButton.setImageDrawable(
@@ -2009,7 +2009,7 @@
                             removeCallbacks(mUpdateProgress);
                             post(mUpdateProgress);
                             resetHideCallbacks();
-                            updateForStoppedState(false);
+                            updateReplayButton(false);
                             break;
                         case SessionPlayer.PLAYER_STATE_PAUSED:
                             playPauseButton.setImageDrawable(
@@ -2089,7 +2089,7 @@
                 if (DEBUG) {
                     Log.d(TAG, "onPlaybackCompleted()");
                 }
-                updateForStoppedState(true);
+                updateReplayButton(true);
                 // The progress bar and current time text may not have been updated.
                 mProgress.setProgress(MAX_PROGRESS);
                 mCurrentTime.setText(stringForTime(mDuration));
diff --git a/media2/src/main/java/androidx/media2/MediaMetadata.java b/media2/src/main/java/androidx/media2/MediaMetadata.java
index c01b242..b10807e 100644
--- a/media2/src/main/java/androidx/media2/MediaMetadata.java
+++ b/media2/src/main/java/androidx/media2/MediaMetadata.java
@@ -52,7 +52,7 @@
  * {@link androidx.media2.widget.MediaControlView} will show title from the metadata.
  * <p>
  * The {@link MediaLibrarySession} would require some metadata values when it provides
- * {@link MediaItem}s to {@link MediaBrowser}.
+ * {@link androidx.media2.MediaItem}s to {@link MediaBrowser}.
  * <p>
  * Topics covered here:
  * <ol>
diff --git a/media2/src/main/java/androidx/media2/MediaPlayer.java b/media2/src/main/java/androidx/media2/MediaPlayer.java
index 5798508..6ad0ee2 100644
--- a/media2/src/main/java/androidx/media2/MediaPlayer.java
+++ b/media2/src/main/java/androidx/media2/MediaPlayer.java
@@ -755,7 +755,7 @@
      * and video decoders.
      *
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @Override
     @NonNull
@@ -1534,7 +1534,7 @@
      * @param surface The {@link Surface} to be used for the video portion of
      * the media.
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> setSurface(@Nullable final Surface surface) {
@@ -1569,7 +1569,7 @@
      *
      * @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}.
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> setPlayerVolume(
@@ -1640,7 +1640,7 @@
      *
      * @param params the playback params.
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> setPlaybackParams(@NonNull final PlaybackParams params) {
@@ -1687,7 +1687,7 @@
      * The value should be in the range of start and end positions defined in {@link MediaItem}.
      * @param mode the mode indicating where exactly to seek to.
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> seekTo(final long position, @SeekMode final int mode) {
@@ -1749,7 +1749,7 @@
      * by calling this method.
      * <p>This method must be called before {@link #setMediaItem} and {@link #setPlaylist} methods.
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      *
      * @see AudioManager#generateAudioSessionId
      */
@@ -1797,7 +1797,7 @@
      * <p>This method must be called before {@link #setMediaItem} and {@link #setPlaylist} methods.
      * @param effectId system wide unique id of the effect to attach
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> attachAuxEffect(final int effectId) {
@@ -1832,7 +1832,7 @@
      * 0 < x <= R -> level = 10^(72*(x-R)/20/R)
      * @param level send level scalar
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> setAuxEffectSendLevel(
@@ -1894,8 +1894,8 @@
     /**
      * Selects a track.
      * <p>
-     * If the player is in invalid state, {@link PlayerResult#RESULT_ERROR_INVALID_STATE} will be
-     * reported with {@link PlayerResult}.
+     * If the player is in invalid state, {@link androidx.media2.SessionPlayer.PlayerResult#RESULT_ERROR_INVALID_STATE} will be
+     * reported with {@link androidx.media2.SessionPlayer.PlayerResult}.
      * If a player is in <em>Playing</em> state, the selected track is presented immediately.
      * If a player is not in Playing state, it just marks the track to be played.
      * </p>
@@ -1917,7 +1917,7 @@
      *
      * @see #getTrackInfo
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> selectTrack(final int index) {
@@ -1951,7 +1951,7 @@
      *
      * @see #getTrackInfo
      * @return a {@link ListenableFuture} which represents the pending completion of the command.
-     * {@link PlayerResult} will be delivered when the command completes.
+     * {@link androidx.media2.SessionPlayer.PlayerResult} will be delivered when the command completes.
      */
     @NonNull
     public ListenableFuture<PlayerResult> deselectTrack(final int index) {
diff --git a/paging/common/src/main/java/androidx/paging/DataSource.java b/paging/common/src/main/java/androidx/paging/DataSource.java
index 07aad2d..2313653 100644
--- a/paging/common/src/main/java/androidx/paging/DataSource.java
+++ b/paging/common/src/main/java/androidx/paging/DataSource.java
@@ -38,7 +38,7 @@
  * it loads more data, but the data loaded cannot be updated. If the underlying data set is
  * modified, a new PagedList / DataSource pair must be created to represent the new data.
  * <h4>Loading Pages</h4>
- * PagedList queries data from its DataSource in response to loading hints. {@link PagedListAdapter}
+ * PagedList queries data from its DataSource in response to loading hints. PagedListAdapter
  * calls {@link PagedList#loadAround(int)} to load content as the user scrolls in a RecyclerView.
  * <p>
  * To control how and when a PagedList queries data from its DataSource, see
@@ -127,7 +127,7 @@
          * DataSource becomes invalid, the only way to query more data is to create a new DataSource
          * from the Factory.
          * <p>
-         * {@link LivePagedListBuilder} for example will construct a new PagedList and DataSource
+         * {@link androidx.paging.LivePagedListBuilder} for example will construct a new PagedList and DataSource
          * when the current DataSource is invalidated, and pass the new PagedList through the
          * {@code LiveData<PagedList>} to observers.
          *
diff --git a/paging/common/src/main/java/androidx/paging/ListenablePageKeyedDataSource.java b/paging/common/src/main/java/androidx/paging/ListenablePageKeyedDataSource.java
index b2d87f8..f15075c 100644
--- a/paging/common/src/main/java/androidx/paging/ListenablePageKeyedDataSource.java
+++ b/paging/common/src/main/java/androidx/paging/ListenablePageKeyedDataSource.java
@@ -129,11 +129,11 @@
      * This method is called first to initialize a PagedList with data. If it's possible to count
      * the items that can be loaded by the DataSource, it's recommended to pass the position and
      * count to the
-     * {@link InitialResult#InitialResult(List, int, int, Key, Key) InitialResult constructor}. This
+     * {@link InitialResult InitialResult constructor}. This
      * enables PagedLists presenting data from this source to display placeholders to represent
      * unloaded items.
      * <p>
-     * {@link PageKeyedDataSource.LoadInitialParams#requestedLoadSize} is a hint, not a requirement,
+     * {@link LoadInitialParams#requestedLoadSize} is a hint, not a requirement,
      * so it may be may be altered or ignored.
      *
      * @param params Parameters for initial load, including requested load size.
diff --git a/paging/common/src/main/java/androidx/paging/ListenablePositionalDataSource.java b/paging/common/src/main/java/androidx/paging/ListenablePositionalDataSource.java
index a4ba462..25c47ab 100644
--- a/paging/common/src/main/java/androidx/paging/ListenablePositionalDataSource.java
+++ b/paging/common/src/main/java/androidx/paging/ListenablePositionalDataSource.java
@@ -31,7 +31,7 @@
  * positions, and provide a fixed item count. If your data source can't support loading arbitrary
  * requested page sizes (e.g. when network page size constraints are only known at runtime), either
  * use {@link PageKeyedDataSource} or {@link ItemKeyedDataSource}, or pass the initial result with
- *  the two parameter {@link InitialResult#InitialResult(List, int)} InitialResult constructor}.
+ *  the two parameter {@link InitialResult InitialResult constructor}.
  *
  * @see PositionalDataSource
  *
diff --git a/paging/common/src/main/java/androidx/paging/PagedList.java b/paging/common/src/main/java/androidx/paging/PagedList.java
index 16533bc..2339f2b 100644
--- a/paging/common/src/main/java/androidx/paging/PagedList.java
+++ b/paging/common/src/main/java/androidx/paging/PagedList.java
@@ -41,7 +41,7 @@
  * <p>
  * A PagedList is a {@link List} which loads its data in chunks (pages) from a {@link DataSource}.
  * Items can be accessed with {@link #get(int)}, and further loading can be triggered with
- * {@link #loadAround(int)}. To display a PagedList, see {@link PagedListAdapter}, which enables the
+ * {@link #loadAround(int)}. To display a PagedList, see {@link androidx.paging.PagedListAdapter}, which enables the
  * binding of a PagedList to a {@link androidx.recyclerview.widget.RecyclerView}.
  * <h4>Loading Data</h4>
  * <p>
@@ -60,8 +60,8 @@
  * PagedList can present data for an unbounded, infinite scrolling list, or a very large but
  * countable list. Use {@link Config} to control how many items a PagedList loads, and when.
  * <p>
- * If you use {@link LivePagedListBuilder} to get a
- * {@link androidx.lifecycle.LiveData}&lt;PagedList>, it will initialize PagedLists on a
+ * If you use {@link androidx.paging.LivePagedListBuilder} to get a
+ * {@link androidx.lifecycle.LiveData}, it will initialize PagedLists on a
  * background thread for you.
  * <h4>Placeholders</h4>
  * <p>
@@ -79,7 +79,7 @@
  * Placeholders have several benefits:
  * <ul>
  *     <li>They express the full sized list to the presentation layer (often a
- *     {@link PagedListAdapter}), and so can support scrollbars (without jumping as pages are
+ *     {@link androidx.paging.PagedListAdapter}), and so can support scrollbars (without jumping as pages are
  *     loaded or dropped) and fast-scrolling to any position, loaded or not.
  *     <li>They avoid the need for a loading spinner at the end of the loaded list, since the list
  *     is always full sized.
@@ -101,13 +101,13 @@
  * <h4>Mutability and Snapshots</h4>
  * A PagedList is <em>mutable</em> while loading, or ready to load from its DataSource.
  * As loads succeed, a mutable PagedList will be updated via Runnables on the main thread. You can
- * listen to these updates with a {@link Callback}. (Note that {@link PagedListAdapter} will listen
+ * listen to these updates with a {@link Callback}. (Note that {@link androidx.paging.PagedListAdapter} will listen
  * to these to signal RecyclerView about the updates/changes).
  * <p>
  * If a PagedList attempts to load from an invalid DataSource, it will {@link #detach()}
  * from the DataSource, meaning that it will no longer attempt to load data. It will return true
  * from {@link #isImmutable()}, and a new DataSource / PagedList pair must be created to load
- * further data. See {@link DataSource} and {@link LivePagedListBuilder} for how new PagedLists are
+ * further data. See {@link DataSource} and {@link androidx.paging.LivePagedListBuilder} for how new PagedLists are
  * created to represent changed data.
  * <p>
  * A PagedList snapshot is simply an immutable shallow copy of the current state of the PagedList as
@@ -299,8 +299,8 @@
      * {@code onError()} to signify the error as retryable.
      * <p>
      * You can observe loading state via {@link #addWeakLoadStateListener(LoadStateListener)},
-     * though generally this is done through the {@link PagedListAdapter} or
-     * {@link AsyncPagedListDiffer}.
+     * though generally this is done through the {@link androidx.paging.PagedListAdapter} or
+     * {@link androidx.paging.AsyncPagedListDiffer}.
      *
      * @see #addWeakLoadStateListener(LoadStateListener)
      * @see #removeWeakLoadStateListener(LoadStateListener)
@@ -443,7 +443,7 @@
      * so that the UI doesn't show an empty list, or placeholders for a few frames, just before
      * showing initial content.
      * <p>
-     * {@link LivePagedListBuilder} does this creation on a background thread automatically, if you
+     * {@link androidx.paging.LivePagedListBuilder} does this creation on a background thread automatically, if you
      * want to receive a {@code LiveData<PagedList<...>>}.
      *
      * @param <Key> Type of key used to load data from the DataSource.
@@ -552,14 +552,14 @@
         /**
          * Creates a {@link PagedList} with the given parameters.
          * <p>
-         * This call will dispatch the {@link DataSource}'s loadInitial method immediately on the
+         * This call will dispatch the {@link androidx.paging.DataSource}'s loadInitial method immediately on the
          * current thread, and block the current on the result. This method should always be called
          * on a worker thread to prevent blocking the main thread.
          * <p>
          * It's fine to create a PagedList with an async DataSource on the main thread, such as in
          * the constructor of a ViewModel. An async network load won't block the initialLoad
          * function. For a synchronous DataSource such as one created from a Room database, a
-         * {@code LiveData<PagedList>} can be safely constructed with {@link LivePagedListBuilder}
+         * {@code LiveData<PagedList>} can be safely constructed with {@link androidx.paging.LivePagedListBuilder}
          * on the main thread, since actual construction work is deferred, and done on a background
          * thread.
          * <p>
@@ -869,7 +869,7 @@
      * <p>
      * When a PagedList is invalidated, you can pass the key returned by this function to initialize
      * the next PagedList. This ensures (depending on load times) that the next PagedList that
-     * arrives will have data that overlaps. If you use {@link LivePagedListBuilder}, it will do
+     * arrives will have data that overlaps. If you use androidx.paging.LivePagedListBuilder, it will do
      * this for you.
      *
      * @return Key of position most recently passed to {@link #loadAround(int)}.
@@ -962,7 +962,7 @@
      * version, including any changes that may have been made.
      * <p>
      * The callback is internally held as weak reference, so PagedList doesn't hold a strong
-     * reference to its observer, such as a {@link PagedListAdapter}. If an adapter were held with a
+     * reference to its observer, such as a {@link androidx.paging.PagedListAdapter}. If an adapter were held with a
      * strong reference, it would be necessary to clear its PagedList observer before it could be
      * GC'd.
      *
@@ -1242,13 +1242,13 @@
              * 2) placeholders are not disabled on the Config.
              * <p>
              * Call {@code setEnablePlaceholders(false)} to ensure the receiver of the PagedList
-             * (often a {@link PagedListAdapter}) doesn't need to account for null items.
+             * (often a {@link androidx.paging.PagedListAdapter}) doesn't need to account for null items.
              * <p>
              * If placeholders are disabled, not-yet-loaded content will not be present in the list.
              * Paging will still occur, but as items are loaded or removed, they will be signaled
              * as inserts to the {@link PagedList.Callback}.
              * {@link PagedList.Callback#onChanged(int, int)} will not be issued as part of loading,
-             * though a {@link PagedListAdapter} may still receive change events as a result of
+             * though a {@link androidx.paging.PagedListAdapter} may still receive change events as a result of
              * PagedList diffing.
              *
              * @param enablePlaceholders False if null placeholders should be disabled.
@@ -1370,7 +1370,7 @@
      * account for the new items.
      * <p>
      * Note that a BoundaryCallback instance shared across multiple PagedLists (e.g. when passed to
-     * {@link LivePagedListBuilder#setBoundaryCallback}), the callbacks may be issued multiple
+     * {@link androidx.paging.LivePagedListBuilder#setBoundaryCallback}, the callbacks may be issued multiple
      * times. If for example {@link #onItemAtEndLoaded(Object)} triggers a network load, it should
      * avoid triggering it again while the load is ongoing.
      * <p>
diff --git a/preference/src/main/java/androidx/preference/Preference.java b/preference/src/main/java/androidx/preference/Preference.java
index 4254dd9..1d449d8 100644
--- a/preference/src/main/java/androidx/preference/Preference.java
+++ b/preference/src/main/java/androidx/preference/Preference.java
@@ -835,7 +835,7 @@
      * the group is visible.
      *
      * @param visible Set false if this preference should be hidden from the user
-     * {@link R.attr#isPreferenceVisible}
+     * {@link androidx.preference.R.attr#isPreferenceVisible}
      * @see #isShown()
      */
     public final void setVisible(boolean visible) {
@@ -997,7 +997,7 @@
      * letting it wrap onto multiple lines.
      *
      * @param singleLineTitle Set {@code true} if the title should be constrained to one line
-     * {@link R.attr#android_singleLineTitle}
+     * {@link android.R.attr#singleLineTitle}
      */
     public void setSingleLineTitle(boolean singleLineTitle) {
         mHasSingleLineTitleAttr = true;
@@ -1008,7 +1008,7 @@
      * Gets whether the title of this preference is constrained to a single line.
      *
      * @return {@code true} if the title of this preference is constrained to a single line
-     * {@link R.attr#android_singleLineTitle}
+     * {@link android.R.attr#singleLineTitle}
      * @see #setSingleLineTitle(boolean)
      */
     public boolean isSingleLineTitle() {
@@ -1021,7 +1021,7 @@
      * other preferences having icons.
      *
      * @param iconSpaceReserved Set {@code true} if the space for the icon view should be reserved
-     * {@link R.attr#android_iconSpaceReserved}
+     * {@link android.R.attr#iconSpaceReserved}
      */
     public void setIconSpaceReserved(boolean iconSpaceReserved) {
         if (mIconSpaceReserved != iconSpaceReserved) {
@@ -1034,7 +1034,7 @@
      * Returns whether the space of this preference icon view is reserved.
      *
      * @return {@code true} if the space of this preference icon view is reserved
-     * {@link R.attr#android_iconSpaceReserved}
+     * {@link android.R.attr#iconSpaceReserved}
      * @see #setIconSpaceReserved(boolean)
      */
     public boolean isIconSpaceReserved() {
diff --git a/preference/src/main/java/androidx/preference/PreferenceFragment.java b/preference/src/main/java/androidx/preference/PreferenceFragment.java
index 50ab41d..bdc6851 100644
--- a/preference/src/main/java/androidx/preference/PreferenceFragment.java
+++ b/preference/src/main/java/androidx/preference/PreferenceFragment.java
@@ -244,7 +244,7 @@
      * call {@link #setDividerHeight(int)}.
      *
      * @param divider The drawable to use
-     * {@link R.attr#android_divider}
+     * {@link android.R.attr#divider}
      *
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
@@ -258,7 +258,7 @@
      * this will override the intrinsic height as set by {@link #setDivider(Drawable)}.
      *
      * @param height The new height of the divider in pixels
-     * {@link R.attr#android_dividerHeight}
+     * {@link android.R.attr#dividerHeight}
      *
      * @deprecated Use {@link PreferenceFragmentCompat} instead
      */
diff --git a/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java b/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
index f490c55..26af8f8 100644
--- a/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
+++ b/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
@@ -237,7 +237,7 @@
      * call {@link #setDividerHeight(int)}.
      *
      * @param divider The drawable to use
-     * {@link R.attr#android_divider}
+     * {@link android.R.attr#divider}
      */
     public void setDivider(Drawable divider) {
         mDividerDecoration.setDivider(divider);
@@ -248,7 +248,7 @@
      * this will override the intrinsic height as set by {@link #setDivider(Drawable)}.
      *
      * @param height The new height of the divider in pixels
-     * {@link R.attr#android_dividerHeight}
+     * {@link android.R.attr#dividerHeight}
      */
     public void setDividerHeight(int height) {
         mDividerDecoration.setDividerHeight(height);
diff --git a/preference/src/main/java/androidx/preference/PreferenceGroup.java b/preference/src/main/java/androidx/preference/PreferenceGroup.java
index 90850b5..9c8f284 100644
--- a/preference/src/main/java/androidx/preference/PreferenceGroup.java
+++ b/preference/src/main/java/androidx/preference/PreferenceGroup.java
@@ -143,7 +143,7 @@
      * correctly persist state.
      *
      * @param expandedCount The number of children that is initially shown
-     * {@link R.attr#initialExpandedChildrenCount}
+     * {@link androidx.preference.R.attr#initialExpandedChildrenCount}
      */
     public void setInitialExpandedChildrenCount(int expandedCount) {
         if (expandedCount != Integer.MAX_VALUE && !hasKey()) {
@@ -157,7 +157,7 @@
      * Gets the maximal number of children that are initially shown.
      *
      * @return The maximal number of children that are initially shown
-     * {@link R.attr#initialExpandedChildrenCount}
+     * {@link androidx.preference.R.attr#initialExpandedChildrenCount}
      */
     public int getInitialExpandedChildrenCount() {
         return mInitialExpandedChildrenCount;
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
index 043eb89..f8e522e 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
@@ -170,7 +170,7 @@
      * Constructor used when layout manager is set in XML by RecyclerView attribute
      * "layoutManager". Defaults to vertical orientation.
      *
-     * {@link androidx.recyclerview.R.attr#android_orientation}
+     * {@link android.R.attr#orientation}
      * {@link androidx.recyclerview.R.attr#reverseLayout}
      * {@link androidx.recyclerview.R.attr#stackFromEnd}
      */
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 1ff33d9..9b29ac1 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -10491,7 +10491,7 @@
         /**
          * Parse the xml attributes to get the most common properties used by layout managers.
          *
-         * {@link androidx.recyclerview.R.attr#android_orientation}
+         * {@link android.R.attr#orientation}
          * {@link androidx.recyclerview.R.attr#spanCount}
          * {@link androidx.recyclerview.R.attr#reverseLayout}
          * {@link androidx.recyclerview.R.attr#stackFromEnd}
@@ -10550,7 +10550,7 @@
          * Some general properties that a LayoutManager may want to use.
          */
         public static class Properties {
-            /** {@link androidx.recyclerview.R.attr#android_orientation} */
+            /** {@link android.R.attr#orientation} */
             public int orientation;
             /** {@link androidx.recyclerview.R.attr#spanCount} */
             public int spanCount;
diff --git a/slices/view/src/main/java/androidx/slice/widget/RowView.java b/slices/view/src/main/java/androidx/slice/widget/RowView.java
index c51c901..aa64268 100644
--- a/slices/view/src/main/java/androidx/slice/widget/RowView.java
+++ b/slices/view/src/main/java/androidx/slice/widget/RowView.java
@@ -846,6 +846,11 @@
                 try {
                     mShowActionSpinner =
                             mRowAction.getActionItem().fireActionInternal(getContext(), null);
+                    if (mObserver != null) {
+                        EventInfo info = new EventInfo(getMode(), EventInfo.ACTION_TYPE_CONTENT,
+                                EventInfo.ROW_TYPE_LIST, mRowIndex);
+                        mObserver.onSliceAction(info, mRowAction.getSliceItem());
+                    }
                     if (mShowActionSpinner && mLoadingListener != null) {
                         mLoadingListener.onSliceActionLoading(mRowAction.getSliceItem(), mRowIndex);
                         mLoadingActions.add(mRowAction.getSliceItem());
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index 5c7fb00..9b3cb41 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -388,7 +388,7 @@
     }
 
     /**
-     * @param orientation @{link {@link ViewPager2.Orientation}}
+     * @param orientation {@link ViewPager2.Orientation}
      */
     public void setOrientation(@Orientation int orientation) {
         mLayoutManager.setOrientation(orientation);
diff --git a/wear/src/main/java/androidx/wear/widget/BoxInsetLayout.java b/wear/src/main/java/androidx/wear/widget/BoxInsetLayout.java
index a838ae3..e43e2bf 100644
--- a/wear/src/main/java/androidx/wear/widget/BoxInsetLayout.java
+++ b/wear/src/main/java/androidx/wear/widget/BoxInsetLayout.java
@@ -389,7 +389,7 @@
      * See {@link R.styleable#BoxInsetLayout_Layout BoxInsetLayout Layout Attributes} for a list
      * of all child view attributes that this class supports.
      *
-     * {@link R.attr#Layout_boxedEdges}
+     * {@link androidx.wear.R.attr#boxedEdges}
      */
     public static class LayoutParams extends FrameLayout.LayoutParams {
 
diff --git a/wear/src/main/java/androidx/wear/widget/RoundedDrawable.java b/wear/src/main/java/androidx/wear/widget/RoundedDrawable.java
index 0c65ccf..52d7151 100644
--- a/wear/src/main/java/androidx/wear/widget/RoundedDrawable.java
+++ b/wear/src/main/java/androidx/wear/widget/RoundedDrawable.java
@@ -118,7 +118,7 @@
      * Sets the drawable to be rendered.
      *
      * @param drawable {@link Drawable} to be rendered
-     * {@link androidx.wear.R.attr#android_src}
+     * {@link android.R.attr#src}
      */
     public void setDrawable(@Nullable Drawable drawable) {
         if (Objects.equals(mDrawable, drawable)) {
diff --git a/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
index 59b0299..923b271 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
@@ -61,7 +61,7 @@
  *     WebViewAssetLoader.Builder assetLoaderBuilder = new WebViewAssetLoader.Builder(this);
  *     final WebViewAssetLoader assetLoader = assetLoaderBuilder.build();
  *     webView.setWebViewClient(new WebViewClient() {
- *         @Override
+ *         {@literal @}Override
  *         public WebResourceResponse shouldInterceptRequest(WebView view,
  *                                          WebResourceRequest request) {
  *             return assetLoader.shouldInterceptRequest(request);
diff --git a/webkit/src/main/java/androidx/webkit/WebViewCompat.java b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
index 9c58fbb..9a1387c6 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewCompat.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewCompat.java
@@ -558,12 +558,12 @@
     /**
      * Sets the renderer client object associated with this WebView.
      *
-     * <p>See {@link #setWebViewRenderProcessClient(WebView,Executor,WebViewRenderProcessClient} for
+     * <p>See {@link WebViewCompat#setWebViewRenderProcessClient(WebView,Executor,WebViewRenderProcessClient)} for
      * details, with the following differences:
      *
      * <p>Callbacks will execute directly on the thread on which this WebView was instantiated.
      *
-     * <p>Passing {@code null} for {@code webViewRenderProcessClien} will clear the renderer client
+     * <p>Passing {@code null} for {@code webViewRenderProcessClient} will clear the renderer client
      * object for this WebView.
      *
      * <p>This method should only be called if
diff --git a/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index 7a244cf..c4bbc75 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -144,7 +144,7 @@
     /**
      * Feature for {@link #isFeatureSupported(String)}.
      * This feature covers
-     * {@link WebViewCompat#getSafeBrowsingPrivacyPolicyUrl()}.
+     * {@link androidx.webkit.WebViewCompat#getSafeBrowsingPrivacyPolicyUrl()}.
      */
     public static final String SAFE_BROWSING_PRIVACY_POLICY_URL =
             "SAFE_BROWSING_PRIVACY_POLICY_URL";
@@ -319,14 +319,14 @@
     /**
      * Feature for {@link #isFeatureSupported(String)}.
      * This feature covers
-     * {@link WebViewCompat#createWebMessageChannel(WebView)}.
+     * {@link androidx.webkit.WebViewCompat#createWebMessageChannel(WebView)}.
      */
     public static final String CREATE_WEB_MESSAGE_CHANNEL = "CREATE_WEB_MESSAGE_CHANNEL";
 
     /**
      * Feature for {@link #isFeatureSupported(String)}.
      * This feature covers
-     * {@link WebViewCompat#postWebMessage(WebView, WebMessageCompat, Uri)}.
+     * {@link androidx.webkit.WebViewCompat#postWebMessage(WebView, WebMessageCompat, Uri)}.
      */
     public static final String POST_WEB_MESSAGE = "POST_WEB_MESSAGE";
 
@@ -341,35 +341,33 @@
 
     /**
      * Feature for {@link #isFeatureSupported(String)}.
-     * This feature covers {@link WebViewCompat#getWebViewClient(WebView)}
+     * This feature covers {@link androidx.webkit.WebViewCompat#getWebViewClient(WebView)}
      */
     public static final String GET_WEB_VIEW_CLIENT = "GET_WEB_VIEW_CLIENT";
 
     /**
      * Feature for {@link #isFeatureSupported(String)}.
-     * This feature covers {@link WebViewCompat#getWebChromeClient(WebView)}
+     * This feature covers {@link androidx.webkit.WebViewCompat#getWebChromeClient(WebView)}
      */
     public static final String GET_WEB_CHROME_CLIENT = "GET_WEB_CHROME_CLIENT";
 
     /**
      * Feature for {@link #isFeatureSupported(String)}.
-     * This feature covers {@link WebViewCompat#getWebViewRenderer(WebView)}
+     * This feature covers {@link androidx.webkit.WebViewCompat#getWebViewRenderProcess(WebView)}
      */
     public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
 
     /**
      * Feature for {@link #isFeatureSupported(String)}.
-     * This feature covers {@link WebViewRenderer#terminate()}
+     * This feature covers {@link WebViewRenderProcess#terminate()}
      */
     public static final String WEB_VIEW_RENDERER_TERMINATE = "WEB_VIEW_RENDERER_TERMINATE";
 
     /**
-     * Feature for {@link #isFeatureSupported(String)}.
+     i* Feature for {@link #isFeatureSupported(String)}.
      * This feature covers
-     * {@link WebViewCompat#getWebViewRendererClient()},
-     * {@link WebViewCompat#setWebViewRendererClient(WebViewRendererClient)},
-     * {@link WebViewRendererClient#onRendererUnresponsive(WebView,WebViewRenderer)},
-     * {@link WebViewRendererClient#onRendererResponsive(WebView,WebViewRenderer)}
+     * {@link androidx.webkit.WebViewCompat#getWebViewRenderProcessClient(WebView)},
+     * {@link androidx.webkit.WebViewCompat#setWebViewRenderProcessClient(WebView, WebViewRenderProcessClient)},
      */
     public static final String WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE =
             "WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE";
@@ -378,9 +376,7 @@
      * Feature for {@link #isFeatureSupported(String)}.
      * This feature covers
      * {@link ProxyController#setProxyOverride(ProxyConfig, Executor, Runnable)},
-     * {@link ProxyController#setProxyOverride(ProxyConfig, Runnable)},
      * {@link ProxyController#clearProxyOverride(Executor, Runnable)}, and
-     * {@link ProxyController#clearProxyOverride(Runnable)}.
      */
     public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE";