Convert ViewTreeSavedStateRegistryOwner to Kotlin

Deprecated helper function `View.findViewTreeSavedStateRegistryOwner()
from savedstate-ktx. Replaced with `View.getViewTreeSavedStateRegistryOwner()` from
`ViewTreeSavedStateRegistryOwner`

Test: ./gradlew checkApi all existing test pass

Bug: 220191285

RelNote: "ViewTreeSavedStateRegistryOwner in SavedState module is now in Kotlin.
Its new `View.findViewTreeSavedStateRegistryOwner()` has replaced the
one from View.kt which is now deprecated"

Change-Id: Ib9cbcc89c1973ea3ee9f554797afdb7763d52d52
diff --git a/activity/activity/src/androidTest/java/androidx/activity/ContentViewTest.kt b/activity/activity/src/androidTest/java/androidx/activity/ContentViewTest.kt
index 830c798..1e69ec6 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/ContentViewTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/ContentViewTest.kt
@@ -23,7 +23,7 @@
 import androidx.activity.test.R
 import androidx.lifecycle.ViewTreeLifecycleOwner
 import androidx.lifecycle.ViewTreeViewModelStoreOwner
-import androidx.savedstate.ViewTreeSavedStateRegistryOwner
+import androidx.savedstate.findViewTreeSavedStateRegistryOwner
 import androidx.test.core.app.ActivityScenario
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -59,7 +59,7 @@
                     .that(ViewTreeViewModelStoreOwner.get(inflatedTextView))
                     .isSameInstanceAs(this@withActivity)
                 assertWithMessage("inflated view has correct ViewTreeSavedStateRegistryOwner")
-                    .that(ViewTreeSavedStateRegistryOwner.get(inflatedTextView))
+                    .that(inflatedTextView.findViewTreeSavedStateRegistryOwner())
                     .isSameInstanceAs(this@withActivity)
             }
         }
@@ -95,7 +95,7 @@
                     override fun onViewAttachedToWindow(v: View?) {
                         attachedLifecycleOwner = ViewTreeLifecycleOwner.get(view)
                         attachedViewModelStoreOwner = ViewTreeViewModelStoreOwner.get(view)
-                        attachedSavedStateRegistryOwner = ViewTreeSavedStateRegistryOwner.get(view)
+                        attachedSavedStateRegistryOwner = view.findViewTreeSavedStateRegistryOwner()
                     }
                 })
                 attach(view)
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatActivityViewTreeTest.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatActivityViewTreeTest.kt
index 9571b75..a2c78463 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatActivityViewTreeTest.kt
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatActivityViewTreeTest.kt
@@ -18,7 +18,7 @@
 
 import androidx.lifecycle.ViewTreeLifecycleOwner
 import androidx.lifecycle.ViewTreeViewModelStoreOwner
-import androidx.savedstate.ViewTreeSavedStateRegistryOwner
+import androidx.savedstate.findViewTreeSavedStateRegistryOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
@@ -49,7 +49,7 @@
 
     @Test
     fun queryViewTreeSavedStateRegistryTest() {
-        val ssrOwner = ViewTreeSavedStateRegistryOwner.get(activityRule.activity.window.decorView)
+        val ssrOwner = activityRule.activity.window.decorView.findViewTreeSavedStateRegistryOwner()
         assertThat(ssrOwner).isEqualTo(activityRule.activity)
     }
 }
\ No newline at end of file
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentViewTreeTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentViewTreeTest.kt
index 4bc2f6b..e6c8cc6 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentViewTreeTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/DialogFragmentViewTreeTest.kt
@@ -23,7 +23,7 @@
 import androidx.fragment.test.R
 import androidx.lifecycle.ViewTreeLifecycleOwner
 import androidx.lifecycle.ViewTreeViewModelStoreOwner
-import androidx.savedstate.ViewTreeSavedStateRegistryOwner
+import androidx.savedstate.findViewTreeSavedStateRegistryOwner
 import androidx.test.core.app.ActivityScenario
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -52,7 +52,7 @@
                 .that(ViewTreeViewModelStoreOwner.get(decorView))
                 .isNotNull()
             assertWithMessage("DialogFragment dialog should have a ViewTreeSavedStateRegistryOwner")
-                .that(ViewTreeSavedStateRegistryOwner.get(decorView))
+                .that(decorView.findViewTreeSavedStateRegistryOwner())
                 .isNotNull()
         }
     }
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleTest.kt
index 1e0fda7..9f26148 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleTest.kt
@@ -30,7 +30,7 @@
 import androidx.lifecycle.Observer
 import androidx.lifecycle.ViewTreeLifecycleOwner
 import androidx.lifecycle.ViewTreeViewModelStoreOwner
-import androidx.savedstate.ViewTreeSavedStateRegistryOwner
+import androidx.savedstate.findViewTreeSavedStateRegistryOwner
 import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
@@ -285,7 +285,7 @@
                     ViewTreeViewModelStoreOwner.get(it)
                 }
                 observedTreeViewSavedStateRegistryOwner = fragment.view?.let {
-                    ViewTreeSavedStateRegistryOwner.get(it)
+                    it.findViewTreeSavedStateRegistryOwner()
                 }
             }
 
@@ -314,10 +314,8 @@
                 " after commitNow"
         )
             .that(
-                ViewTreeSavedStateRegistryOwner.get(
-                    fragment.view
-                        ?: error("no fragment view created")
-                )
+                (fragment.view ?: error("no fragment view created"))
+                    .findViewTreeSavedStateRegistryOwner()
             )
             .isSameInstanceAs(fragment.viewLifecycleOwner)
 
@@ -406,7 +404,7 @@
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
             onViewCreatedLifecycleOwner = ViewTreeLifecycleOwner.get(view)
             onViewCreatedViewModelStoreOwner = ViewTreeViewModelStoreOwner.get(view)
-            onViewCreatedSavedStateRegistryOwner = ViewTreeSavedStateRegistryOwner.get(view)
+            onViewCreatedSavedStateRegistryOwner = view.findViewTreeSavedStateRegistryOwner()
         }
     }
 
@@ -464,7 +462,7 @@
         var restoredState: String? = null
 
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-            val savedStateRegistryOwner = ViewTreeSavedStateRegistryOwner.get(view)!!
+            val savedStateRegistryOwner = view.findViewTreeSavedStateRegistryOwner()!!
             val savedStateLifecycle = savedStateRegistryOwner.lifecycle
             val savedStateRegistry = savedStateRegistryOwner.savedStateRegistry
             savedStateLifecycle.addObserver(
diff --git a/lifecycle/lifecycle-viewmodel-compose/src/androidTest/java/androidx/lifecycle/viewmodel/compose/ViewModelTest.kt b/lifecycle/lifecycle-viewmodel-compose/src/androidTest/java/androidx/lifecycle/viewmodel/compose/ViewModelTest.kt
index fbd860e..0df553a 100644
--- a/lifecycle/lifecycle-viewmodel-compose/src/androidTest/java/androidx/lifecycle/viewmodel/compose/ViewModelTest.kt
+++ b/lifecycle/lifecycle-viewmodel-compose/src/androidTest/java/androidx/lifecycle/viewmodel/compose/ViewModelTest.kt
@@ -33,7 +33,7 @@
 import androidx.lifecycle.ViewTreeLifecycleOwner
 import androidx.lifecycle.viewmodel.CreationExtras
 import androidx.lifecycle.viewmodel.MutableCreationExtras
-import androidx.savedstate.ViewTreeSavedStateRegistryOwner
+import androidx.savedstate.setViewTreeSavedStateRegistryOwner
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
 import com.google.common.truth.Truth.assertThat
@@ -68,7 +68,7 @@
                 dialog.window?.decorView?.run {
                     // Specifically only set the LifecycleOwner and SavedStateRegistryOwner
                     ViewTreeLifecycleOwner.set(this, lifecycleOwner)
-                    ViewTreeSavedStateRegistryOwner.set(this, savedStateRegistryOwner)
+                    setViewTreeSavedStateRegistryOwner(savedStateRegistryOwner)
                 }
 
                 onDispose {
diff --git a/savedstate/savedstate-ktx/api/current.ignore b/savedstate/savedstate-ktx/api/current.ignore
new file mode 100644
index 0000000..b576716
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+InvalidNullConversion: androidx.savedstate.ViewKt#findViewTreeSavedStateRegistryOwner(android.view.View):
+    Attempted to remove @Nullable annotation from method androidx.savedstate.ViewKt.findViewTreeSavedStateRegistryOwner(android.view.View)
diff --git a/savedstate/savedstate-ktx/api/current.txt b/savedstate/savedstate-ktx/api/current.txt
index 13e3138..b01f511 100644
--- a/savedstate/savedstate-ktx/api/current.txt
+++ b/savedstate/savedstate-ktx/api/current.txt
@@ -2,7 +2,7 @@
 package androidx.savedstate {
 
   public final class ViewKt {
-    method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+    method @Deprecated public static androidx.savedstate.SavedStateRegistryOwner! findViewTreeSavedStateRegistryOwner(android.view.View);
   }
 
 }
diff --git a/savedstate/savedstate-ktx/api/public_plus_experimental_current.txt b/savedstate/savedstate-ktx/api/public_plus_experimental_current.txt
index 13e3138..b01f511 100644
--- a/savedstate/savedstate-ktx/api/public_plus_experimental_current.txt
+++ b/savedstate/savedstate-ktx/api/public_plus_experimental_current.txt
@@ -2,7 +2,7 @@
 package androidx.savedstate {
 
   public final class ViewKt {
-    method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+    method @Deprecated public static androidx.savedstate.SavedStateRegistryOwner! findViewTreeSavedStateRegistryOwner(android.view.View);
   }
 
 }
diff --git a/savedstate/savedstate-ktx/api/restricted_current.ignore b/savedstate/savedstate-ktx/api/restricted_current.ignore
new file mode 100644
index 0000000..b576716
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/restricted_current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+InvalidNullConversion: androidx.savedstate.ViewKt#findViewTreeSavedStateRegistryOwner(android.view.View):
+    Attempted to remove @Nullable annotation from method androidx.savedstate.ViewKt.findViewTreeSavedStateRegistryOwner(android.view.View)
diff --git a/savedstate/savedstate-ktx/api/restricted_current.txt b/savedstate/savedstate-ktx/api/restricted_current.txt
index 13e3138..b01f511 100644
--- a/savedstate/savedstate-ktx/api/restricted_current.txt
+++ b/savedstate/savedstate-ktx/api/restricted_current.txt
@@ -2,7 +2,7 @@
 package androidx.savedstate {
 
   public final class ViewKt {
-    method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+    method @Deprecated public static androidx.savedstate.SavedStateRegistryOwner! findViewTreeSavedStateRegistryOwner(android.view.View);
   }
 
 }
diff --git a/savedstate/savedstate-ktx/src/main/java/androidx/savedstate/View.kt b/savedstate/savedstate-ktx/src/main/java/androidx/savedstate/View.kt
index be8e1b7..aebee41 100644
--- a/savedstate/savedstate-ktx/src/main/java/androidx/savedstate/View.kt
+++ b/savedstate/savedstate-ktx/src/main/java/androidx/savedstate/View.kt
@@ -21,6 +21,15 @@
 /**
  * Locates the [SavedStateRegistryOwner] associated with this [View], if present.
  * This may be used to save and restore the state associated with this view.
+ *
  */
+@Deprecated(
+    message = "Replaced by View.findViewTreeSavedStateRegistryOwner() from savedstate module",
+    replaceWith = ReplaceWith(
+        "findViewTreeSavedStateRegistryOwner()",
+        "androidx.savedstate.findViewTreeSavedStateRegistryOwner"
+    ),
+    level = DeprecationLevel.HIDDEN
+)
 public fun View.findViewTreeSavedStateRegistryOwner(): SavedStateRegistryOwner? =
-    ViewTreeSavedStateRegistryOwner.get(this)
+    findViewTreeSavedStateRegistryOwner()
diff --git a/savedstate/savedstate/api/current.txt b/savedstate/savedstate/api/current.txt
index 1d2cca2..6ef8e87 100644
--- a/savedstate/savedstate/api/current.txt
+++ b/savedstate/savedstate/api/current.txt
@@ -39,7 +39,7 @@
 
   public final class ViewTreeSavedStateRegistryOwner {
     method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
-    method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
+    method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner? owner);
   }
 
 }
diff --git a/savedstate/savedstate/api/public_plus_experimental_current.txt b/savedstate/savedstate/api/public_plus_experimental_current.txt
index 1d2cca2..6ef8e87 100644
--- a/savedstate/savedstate/api/public_plus_experimental_current.txt
+++ b/savedstate/savedstate/api/public_plus_experimental_current.txt
@@ -39,7 +39,7 @@
 
   public final class ViewTreeSavedStateRegistryOwner {
     method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
-    method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
+    method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner? owner);
   }
 
 }
diff --git a/savedstate/savedstate/api/restricted_current.txt b/savedstate/savedstate/api/restricted_current.txt
index 1d2cca2..6ef8e87 100644
--- a/savedstate/savedstate/api/restricted_current.txt
+++ b/savedstate/savedstate/api/restricted_current.txt
@@ -39,7 +39,7 @@
 
   public final class ViewTreeSavedStateRegistryOwner {
     method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
-    method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
+    method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner? owner);
   }
 
 }
diff --git a/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.kt b/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.kt
index e82e908..89e347e 100644
--- a/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.kt
+++ b/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.kt
@@ -13,70 +13,50 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+@file:JvmName("ViewTreeSavedStateRegistryOwner")
 
-package androidx.savedstate;
+package androidx.savedstate
 
-import android.view.View;
-import android.view.ViewParent;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import android.view.View
 
 /**
- * Accessors for finding a view tree-local {@link SavedStateRegistryOwner} that allows managing the
- * saving state using {@link SavedStateRegistry} for the given view.
+ * Set the [SavedStateRegistryOwner] responsible for managing the saved state for this [View]
+ * Calls to [get] from this view or descendants will return `owner`.
+ *
+ * This is is automatically set for you in the common cases of using fragments or
+ * ComponentActivity.
+ *
+ *
+ * This should only be called by constructs such as activities or fragments that manage
+ * a view tree and their saved state through a [SavedStateRegistryOwner]. Callers
+ * should only set a [SavedStateRegistryOwner] that will be *stable.* The
+ * associated [SavedStateRegistry] should be cleared if the view tree is removed and is
+ * not guaranteed to later become reattached to a window.
+ *
+ * @param owner The [SavedStateRegistryOwner] responsible for managing the
+ * saved state for the given view
  */
-public final class ViewTreeSavedStateRegistryOwner {
-    private ViewTreeSavedStateRegistryOwner() {
-        // No instances
-    }
+@JvmName("set")
+fun View.setViewTreeSavedStateRegistryOwner(owner: SavedStateRegistryOwner?) {
+    setTag(R.id.view_tree_saved_state_registry_owner, owner)
+}
 
-    /**
-     * Set the {@link SavedStateRegistryOwner} responsible for managing the saved state for the
-     * given {@link View}.
-     * Calls to {@link #get(View)} from this view or descendants will return {@code owner}.
-     *
-     * This is is automatically set for you in the common cases of using fragments or
-     * ComponentActivity.
-     *
-     * <p>This should only be called by constructs such as activities or fragments that manage
-     * a view tree and their saved state through a {@link SavedStateRegistryOwner}. Callers
-     * should only set a {@link SavedStateRegistryOwner} that will be <em>stable.</em> The
-     * associated {@link SavedStateRegistry} should be cleared if the view tree is removed and is
-     * not guaranteed to later become reattached to a window.</p>
-     *
-     * @param view Root view managed by {@link SavedStateRegistryOwner}
-     * @param owner The {@link SavedStateRegistryOwner} responsible for managing the
-     *              saved state for the given view
-     */
-    public static void set(@NonNull View view, @Nullable SavedStateRegistryOwner owner) {
-        view.setTag(R.id.view_tree_saved_state_registry_owner, owner);
-    }
+/**
+ * Retrieve the [SavedStateRegistryOwner] responsible for managing the saved state
+ * for this [View].
+ * This may be used to save or restore the state associated with the view.
+ *
+ * The returned [SavedStateRegistryOwner] is managing all the Views within the Fragment
+ * or Activity this [View] is added to.
 
-    /**
-     * Retrieve the {@link SavedStateRegistryOwner} responsible for managing the saved state
-     * for the given {@link View}.
-     * This may be used to save or restore the state associated with the view.
-     *
-     * The returned {@link SavedStateRegistryOwner} is managing all the Views within the Fragment
-     * or Activity the given {@link View} is added to.
-     *
-     * @param view View to fetch a {@link SavedStateRegistryOwner} for
-     * @return The {@link SavedStateRegistryOwner} responsible for managing the saved state for
-     *         the given view and/or some subset of its ancestors
-     */
-    @Nullable
-    public static SavedStateRegistryOwner get(@NonNull View view) {
-        SavedStateRegistryOwner found = (SavedStateRegistryOwner) view.getTag(
-                R.id.view_tree_saved_state_registry_owner);
-        if (found != null) return found;
-        ViewParent parent = view.getParent();
-        while (found == null && parent instanceof View) {
-            final View parentView = (View) parent;
-            found = (SavedStateRegistryOwner) parentView.getTag(
-                    R.id.view_tree_saved_state_registry_owner);
-            parent = parentView.getParent();
-        }
-        return found;
-    }
+ * @return The [SavedStateRegistryOwner] responsible for managing the saved state for
+ * this view and/or some subset of its ancestors
+ */
+@JvmName("get")
+fun View.findViewTreeSavedStateRegistryOwner(): SavedStateRegistryOwner? {
+    return generateSequence(this) { view ->
+        view.parent as? View
+    }.mapNotNull { view ->
+        view.getTag(R.id.view_tree_saved_state_registry_owner) as? SavedStateRegistryOwner
+    }.firstOrNull()
 }