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()
}