diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt index 566c2ab846c3d..67043c817497d 100644 --- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt +++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/interoperability/InteropArchitecture.kt @@ -96,7 +96,7 @@ private object InteropArchitectureSnippet1 { class GreetingViewModelFactory(private val userId: String) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { return GreetingViewModel(userId) as T } } @@ -211,7 +211,7 @@ private class GreetingViewModel(userId: String) : ViewModel() { } private class GreetingViewModelFactory(private val userId: String) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { return GreetingViewModel(userId) as T } } diff --git a/fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioViewModelTest.kt b/fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioViewModelTest.kt index 12e0b2f0bceea..d88bcbac5ff5e 100644 --- a/fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioViewModelTest.kt +++ b/fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioViewModelTest.kt @@ -44,7 +44,7 @@ class FragmentScenarioViewModelTest { `when`(mockViewModel.getUserName()).thenReturn(fakeUserName) val viewModelFactory = object : ViewModelProvider.NewInstanceFactory() { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { return when (modelClass) { InjectedViewModel::class.java -> mockViewModel as T else -> super.create(modelClass) diff --git a/fragment/fragment-testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.kt b/fragment/fragment-testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.kt index 8e799df295aa0..265acc69bd7fb 100644 --- a/fragment/fragment-testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.kt +++ b/fragment/fragment-testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.kt @@ -293,7 +293,7 @@ public class FragmentScenario private constructor( internal val FACTORY: ViewModelProvider.Factory = object : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { val viewModel = FragmentFactoryHolderViewModel() return viewModel as T diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleOwnerTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleOwnerTest.kt index 67ae8722d94b7..875b198bae6ad 100644 --- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleOwnerTest.kt +++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentViewLifecycleOwnerTest.kt @@ -96,7 +96,7 @@ class FragmentViewLifecycleOwnerTest { class FakeViewModelProviderFactory : ViewModelProvider.Factory { private var createCalled: Boolean = false - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { require(modelClass == TestViewModel::class.java) createCalled = true @Suppress("UNCHECKED_CAST") diff --git a/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelProvidersFragmentTest.kt b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelProvidersFragmentTest.kt index 9cfd0c941dba3..71f909d3ff5ad 100644 --- a/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelProvidersFragmentTest.kt +++ b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelProvidersFragmentTest.kt @@ -84,7 +84,7 @@ class ViewModelProvidersFragmentTest { class CountingFactory : ViewModelProvider.NewInstanceFactory() { var count = 0 - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { count++ return super.create(modelClass) } 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 e4a868df29e6f..5836e9597b219 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 @@ -202,7 +202,7 @@ private class TestViewModel : ViewModel() private class FakeViewModelProviderFactory : ViewModelProvider.Factory { var createCalled = false - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { require(modelClass == TestViewModel::class.java) createCalled = true @Suppress("UNCHECKED_CAST") diff --git a/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt b/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProviderExtensions.kt similarity index 98% rename from lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt rename to lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProviderExtensions.kt index 444831bd76a6d..e87e103413b19 100644 --- a/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt +++ b/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProviderExtensions.kt @@ -14,6 +14,7 @@ * limitations under the License. */ +@file:JvmName("ViewModelProviderKt") package androidx.lifecycle import androidx.annotation.MainThread @@ -60,4 +61,4 @@ public class ViewModelLazy ( } override fun isInitialized(): Boolean = cached != null -} \ No newline at end of file +} diff --git a/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt b/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt index 44d4d0b9906d0..9a9b016cba12f 100644 --- a/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt +++ b/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt @@ -37,6 +37,7 @@ class ViewModelLazyTest { @Suppress("UNCHECKED_CAST") class TestFactory : ViewModelProvider.Factory { - override fun create(modelClass: Class): T = TestVM("spb") as T + + override fun create(modelClass: Class): T = TestVM("spb") as T } } \ No newline at end of file diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.ignore b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.ignore new file mode 100644 index 0000000000000..f85d9e1bbc4f2 --- /dev/null +++ b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.ignore @@ -0,0 +1,9 @@ +// Baseline format: 1.0 +RemovedInterface: androidx.lifecycle.AbstractSavedStateViewModelFactory: + Class androidx.lifecycle.AbstractSavedStateViewModelFactory no longer implements androidx.lifecycle.ViewModelProvider.Factory +RemovedInterface: androidx.lifecycle.SavedStateViewModelFactory: + Class androidx.lifecycle.SavedStateViewModelFactory no longer implements androidx.lifecycle.ViewModelProvider.Factory + + +RemovedMethod: androidx.lifecycle.SavedStateViewModelFactory#create(Class): + Removed method androidx.lifecycle.SavedStateViewModelFactory.create(Class) diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt index 0d02bcbe4602e..669dd6eacc4ea 100644 --- a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt +++ b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt @@ -1,7 +1,7 @@ // Signature format: 4.0 package androidx.lifecycle { - public abstract class AbstractSavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory { + public abstract class AbstractSavedStateViewModelFactory extends androidx.lifecycle.ViewModelProvider.KeyedFactory { ctor public AbstractSavedStateViewModelFactory(androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?); method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final T create(String, Class); method public final T create(Class); @@ -22,11 +22,10 @@ package androidx.lifecycle { method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider); } - public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory { + public final class SavedStateViewModelFactory extends androidx.lifecycle.ViewModelProvider.KeyedFactory { ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner); ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?); method public T create(String, Class); - method public T create(Class); } } diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt index 8d91832d1e797..ee5f16f04d1d3 100644 --- a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt +++ b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt @@ -82,7 +82,7 @@ class SavedStateFactoryTest { val savedStateVMFactory = object : AbstractSavedStateViewModelFactory( activity, null ) { - override fun create( + override fun create( key: String, modelClass: Class, handle: SavedStateHandle diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt index a05ae3d77864a..bb6605f0f877d 100644 --- a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt +++ b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTest.kt @@ -153,7 +153,7 @@ class ViewModelsWithStateTest(private val mode: Mode) { SavedStateViewModelFactory(activity.application, savedStateOwner) as Factory } else { object : AbstractSavedStateViewModelFactory(savedStateOwner, null) { - override fun create( + override fun create( key: String, modelClass: Class, handle: SavedStateHandle diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java index 4eccdc3a4de11..d1438f990a7af 100644 --- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java +++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateViewModelFactory.java @@ -98,8 +98,12 @@ public final T create(@NonNull Class modelClass) { protected abstract T create(@NonNull String key, @NonNull Class modelClass, @NonNull SavedStateHandle handle); + /** + * @hide + */ @Override - void onRequery(@NonNull ViewModel viewModel) { + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) + public void onRequery(@NonNull ViewModel viewModel) { attachHandleIfNeeded(viewModel, mSavedStateRegistry, mLifecycle); } } diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java index 37fd9e9270cdb..7dc7b0d0efd5d 100644 --- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java +++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateViewModelFactory.java @@ -25,6 +25,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RestrictTo; import androidx.savedstate.SavedStateRegistry; import androidx.savedstate.SavedStateRegistryOwner; @@ -162,8 +163,12 @@ private static Constructor findMatchingConstructor(Class modelClass, return null; } + /** + * @hide + */ @Override - void onRequery(@NonNull ViewModel viewModel) { + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) + public void onRequery(@NonNull ViewModel viewModel) { attachHandleIfNeeded(viewModel, mSavedStateRegistry, mLifecycle); } } diff --git a/lifecycle/lifecycle-viewmodel/api/api_lint.ignore b/lifecycle/lifecycle-viewmodel/api/api_lint.ignore index 8582fa1b41f4b..8b1db86c51047 100644 --- a/lifecycle/lifecycle-viewmodel/api/api_lint.ignore +++ b/lifecycle/lifecycle-viewmodel/api/api_lint.ignore @@ -1,9 +1,9 @@ // Baseline format: 1.0 -KotlinOperator: androidx.lifecycle.ViewModelProvider#get(Class): - Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object) -KotlinOperator: androidx.lifecycle.ViewModelProvider#get(String, Class): - Method can be invoked with an indexing operator from Kotlin: `get` (this is usually desirable; just make sure it makes sense for this type of object) +MissingJvmstatic: androidx.lifecycle.ViewModelProvider.NewInstanceFactory#instance: + Companion object constants like instance should be using @JvmField, not @JvmStatic; see https://developer.android.com/kotlin/interop#companion_constants SingletonConstructor: androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory#AndroidViewModelFactory(android.app.Application): Singleton classes should use `getInstance()` methods: `AndroidViewModelFactory` +SingletonConstructor: androidx.lifecycle.ViewModelProvider.NewInstanceFactory#NewInstanceFactory(): + Singleton classes should use `getInstance()` methods: `NewInstanceFactory` diff --git a/lifecycle/lifecycle-viewmodel/api/current.txt b/lifecycle/lifecycle-viewmodel/api/current.txt index 1a5b37ea6dd44..2668991dfb6e1 100644 --- a/lifecycle/lifecycle-viewmodel/api/current.txt +++ b/lifecycle/lifecycle-viewmodel/api/current.txt @@ -16,25 +16,34 @@ package androidx.lifecycle { } public class ViewModelProvider { - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner); - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner, androidx.lifecycle.ViewModelProvider.Factory); - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore, androidx.lifecycle.ViewModelProvider.Factory); - method @MainThread public T get(Class); - method @MainThread public T get(String, Class); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory); + method @MainThread public operator T get(Class modelClass); + method @MainThread public operator T get(String key, Class modelClass); } public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory { - ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application); - method public static androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application); + ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application); + method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application); + field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion; + } + + public static final class ViewModelProvider.AndroidViewModelFactory.Companion { + method public androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application); } public static interface ViewModelProvider.Factory { - method public T create(Class); + method public T create(Class modelClass); } public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory { ctor public ViewModelProvider.NewInstanceFactory(); - method public T create(Class); + method public T create(Class modelClass); + field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion; + } + + public static final class ViewModelProvider.NewInstanceFactory.Companion { } public class ViewModelStore { diff --git a/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt index 1a5b37ea6dd44..2668991dfb6e1 100644 --- a/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt +++ b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt @@ -16,25 +16,34 @@ package androidx.lifecycle { } public class ViewModelProvider { - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner); - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner, androidx.lifecycle.ViewModelProvider.Factory); - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore, androidx.lifecycle.ViewModelProvider.Factory); - method @MainThread public T get(Class); - method @MainThread public T get(String, Class); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory); + method @MainThread public operator T get(Class modelClass); + method @MainThread public operator T get(String key, Class modelClass); } public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory { - ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application); - method public static androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application); + ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application); + method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application); + field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion; + } + + public static final class ViewModelProvider.AndroidViewModelFactory.Companion { + method public androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application); } public static interface ViewModelProvider.Factory { - method public T create(Class); + method public T create(Class modelClass); } public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory { ctor public ViewModelProvider.NewInstanceFactory(); - method public T create(Class); + method public T create(Class modelClass); + field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion; + } + + public static final class ViewModelProvider.NewInstanceFactory.Companion { } public class ViewModelStore { diff --git a/lifecycle/lifecycle-viewmodel/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt index 1a5b37ea6dd44..27904ad1c0a75 100644 --- a/lifecycle/lifecycle-viewmodel/api/restricted_current.txt +++ b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt @@ -16,25 +16,46 @@ package androidx.lifecycle { } public class ViewModelProvider { - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner); - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner, androidx.lifecycle.ViewModelProvider.Factory); - ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore, androidx.lifecycle.ViewModelProvider.Factory); - method @MainThread public T get(Class); - method @MainThread public T get(String, Class); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStore store, androidx.lifecycle.ViewModelProvider.Factory factory); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner); + ctor public ViewModelProvider(androidx.lifecycle.ViewModelStoreOwner owner, androidx.lifecycle.ViewModelProvider.Factory factory); + method @MainThread public operator T get(Class modelClass); + method @MainThread public operator T get(String key, Class modelClass); } public static class ViewModelProvider.AndroidViewModelFactory extends androidx.lifecycle.ViewModelProvider.NewInstanceFactory { - ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application); - method public static androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application); + ctor public ViewModelProvider.AndroidViewModelFactory(android.app.Application application); + method public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application); + field public static final androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion Companion; + } + + public static final class ViewModelProvider.AndroidViewModelFactory.Companion { + method public androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory getInstance(android.app.Application application); } public static interface ViewModelProvider.Factory { - method public T create(Class); + method public T create(Class modelClass); + } + + @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public abstract static class ViewModelProvider.KeyedFactory extends androidx.lifecycle.ViewModelProvider.OnRequeryFactory implements androidx.lifecycle.ViewModelProvider.Factory { + method public abstract T create(String key, Class modelClass); + method public T create(Class modelClass); } public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory { ctor public ViewModelProvider.NewInstanceFactory(); - method public T create(Class); + method public T create(Class modelClass); + method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory getInstance(); + field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion; + } + + public static final class ViewModelProvider.NewInstanceFactory.Companion { + method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.lifecycle.ViewModelProvider.NewInstanceFactory getInstance(); + property @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public final androidx.lifecycle.ViewModelProvider.NewInstanceFactory instance; + } + + @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static class ViewModelProvider.OnRequeryFactory { + method public void onRequery(androidx.lifecycle.ViewModel viewModel); } public class ViewModelStore { diff --git a/lifecycle/lifecycle-viewmodel/build.gradle b/lifecycle/lifecycle-viewmodel/build.gradle index 50abd68c518f1..ca85890a5038f 100644 --- a/lifecycle/lifecycle-viewmodel/build.gradle +++ b/lifecycle/lifecycle-viewmodel/build.gradle @@ -32,7 +32,7 @@ android { dependencies { api("androidx.annotation:annotation:1.1.0") - + api(libs.kotlinStdlib) testImplementation(libs.junit) testImplementation(libs.mockitoCore) diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java index 1db66587834c8..dea6695fae7c4 100644 --- a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java +++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/HasDefaultViewModelProviderFactory.java @@ -20,14 +20,14 @@ /** * Interface that marks a {@link ViewModelStoreOwner} as having a default - * {@link ViewModelProvider.Factory} for use with - * {@link ViewModelProvider#ViewModelProvider(ViewModelStoreOwner)}. + * {@link androidx.lifecycle.ViewModelProvider.Factory} for use with + * {@link androidx.lifecycle.ViewModelProvider#ViewModelProvider(ViewModelStoreOwner)}. */ public interface HasDefaultViewModelProviderFactory { /** - * Returns the default {@link ViewModelProvider.Factory} that should be + * Returns the default {@link androidx.lifecycle.ViewModelProvider.Factory} that should be * used when no custom {@code Factory} is provided to the - * {@link ViewModelProvider} constructors. + * {@link androidx.lifecycle.ViewModelProvider} constructors. * * @return a {@code ViewModelProvider.Factory} */ diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt index cb24a1a8a9b8f..9911c2a122a62 100644 --- a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt +++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt @@ -13,269 +13,253 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package androidx.lifecycle -package androidx.lifecycle; - -import android.app.Application; - -import androidx.annotation.MainThread; -import androidx.annotation.NonNull; - -import java.lang.reflect.InvocationTargetException; +import android.app.Application +import androidx.annotation.MainThread +import androidx.annotation.RestrictTo +import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.DEFAULT_KEY +import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.defaultFactory +import java.lang.IllegalArgumentException +import java.lang.RuntimeException +import java.lang.UnsupportedOperationException +import java.lang.reflect.InvocationTargetException /** - * An utility class that provides {@code ViewModels} for a scope. - *

- * Default {@code ViewModelProvider} for an {@code Activity} or a {@code Fragment} can be obtained - * by passing it to {@link ViewModelProvider#ViewModelProvider(ViewModelStoreOwner)}. + * An utility class that provides `ViewModels` for a scope. + * + * Default `ViewModelProvider` for an `Activity` or a `Fragment` can be obtained + * by passing it to the constructor: `ViewModelProvider(myFragment)` + * + * @param store `ViewModelStore` where ViewModels will be stored. + * @param factory factory a `Factory` which will be used to instantiate + * new `ViewModels` */ -@SuppressWarnings("WeakerAccess") -public class ViewModelProvider { - - private static final String DEFAULT_KEY = - "androidx.lifecycle.ViewModelProvider.DefaultKey"; - +public open class ViewModelProvider( + private val store: ViewModelStore, + private val factory: Factory +) { /** - * Implementations of {@code Factory} interface are responsible to instantiate ViewModels. + * Implementations of `Factory` interface are responsible to instantiate ViewModels. */ public interface Factory { /** - * Creates a new instance of the given {@code Class}. - *

+ * Creates a new instance of the given `Class`. * - * @param modelClass a {@code Class} whose instance is requested - * @param The type parameter for the ViewModel. + * @param modelClass a `Class` whose instance is requested * @return a newly created ViewModel */ - @NonNull - T create(@NonNull Class modelClass); + public fun create(modelClass: Class): T } - static class OnRequeryFactory { - void onRequery(@NonNull ViewModel viewModel) { - } + /** + * @suppress + */ + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) + public open class OnRequeryFactory { + public open fun onRequery(viewModel: ViewModel) {} } /** - * Implementations of {@code Factory} interface are responsible to instantiate ViewModels. - *

- * This is more advanced version of {@link Factory} that receives a key specified for requested - * {@link ViewModel}. + * Implementations of `Factory` interface are responsible to instantiate ViewModels. + * + * + * This is more advanced version of [Factory] that receives a key specified for requested + * [ViewModel]. + * + * @suppress */ - abstract static class KeyedFactory extends OnRequeryFactory implements Factory { + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) + public abstract class KeyedFactory : OnRequeryFactory(), Factory { /** - * Creates a new instance of the given {@code Class}. + * Creates a new instance of the given `Class`. * * @param key a key associated with the requested ViewModel - * @param modelClass a {@code Class} whose instance is requested - * @param The type parameter for the ViewModel. + * @param modelClass a `Class` whose instance is requested * @return a newly created ViewModel */ - @NonNull - public abstract T create(@NonNull String key, - @NonNull Class modelClass); + public abstract fun create( + key: String, + modelClass: Class + ): T - @NonNull - @Override - public T create(@NonNull Class modelClass) { - throw new UnsupportedOperationException("create(String, Class) must be called on " - + "implementaions of KeyedFactory"); + override fun create(modelClass: Class): T { + throw UnsupportedOperationException( + "create(String, Class) must be called on implementations of KeyedFactory" + ) } } - private final Factory mFactory; - private final ViewModelStore mViewModelStore; - /** - * Creates {@code ViewModelProvider}. This will create {@code ViewModels} - * and retain them in a store of the given {@code ViewModelStoreOwner}. - *

- * This method will use the - * {@link HasDefaultViewModelProviderFactory#getDefaultViewModelProviderFactory() default factory} - * if the owner implements {@link HasDefaultViewModelProviderFactory}. Otherwise, a - * {@link NewInstanceFactory} will be used. - */ - public ViewModelProvider(@NonNull ViewModelStoreOwner owner) { - this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory - ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory() - : NewInstanceFactory.getInstance()); - } - - /** - * Creates {@code ViewModelProvider}, which will create {@code ViewModels} via the given - * {@code Factory} and retain them in a store of the given {@code ViewModelStoreOwner}. + * Creates `ViewModelProvider`. This will create `ViewModels` + * and retain them in a store of the given `ViewModelStoreOwner`. + * * - * @param owner a {@code ViewModelStoreOwner} whose {@link ViewModelStore} will be used to - * retain {@code ViewModels} - * @param factory a {@code Factory} which will be used to instantiate - * new {@code ViewModels} + * This method will use the + * [default factory][HasDefaultViewModelProviderFactory.getDefaultViewModelProviderFactory] + * if the owner implements [HasDefaultViewModelProviderFactory]. Otherwise, a + * [NewInstanceFactory] will be used. */ - public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) { - this(owner.getViewModelStore(), factory); - } + public constructor( + owner: ViewModelStoreOwner + ) : this(owner.viewModelStore, defaultFactory(owner)) /** - * Creates {@code ViewModelProvider}, which will create {@code ViewModels} via the given - * {@code Factory} and retain them in the given {@code store}. + * Creates `ViewModelProvider`, which will create `ViewModels` via the given + * `Factory` and retain them in a store of the given `ViewModelStoreOwner`. * - * @param store {@code ViewModelStore} where ViewModels will be stored. - * @param factory factory a {@code Factory} which will be used to instantiate - * new {@code ViewModels} + * @param owner a `ViewModelStoreOwner` whose [ViewModelStore] will be used to + * retain `ViewModels` + * @param factory a `Factory` which will be used to instantiate + * new `ViewModels` */ - public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) { - mFactory = factory; - mViewModelStore = store; - } + public constructor(owner: ViewModelStoreOwner, factory: Factory) : this( + owner.viewModelStore, + factory + ) /** * Returns an existing ViewModel or creates a new one in the scope (usually, a fragment or - * an activity), associated with this {@code ViewModelProvider}. - *

+ * an activity), associated with this `ViewModelProvider`. + * + * * The created ViewModel is associated with the given scope and will be retained * as long as the scope is alive (e.g. if it is an activity, until it is * finished or process is killed). * * @param modelClass The class of the ViewModel to create an instance of it if it is not - * present. - * @param The type parameter for the ViewModel. - * @return A ViewModel that is an instance of the given type {@code T}. + * present. + * @return A ViewModel that is an instance of the given type `T`. + * @throws IllegalArgumentException if the given [modelClass] is local or anonymous class. */ - @NonNull @MainThread - public T get(@NonNull Class modelClass) { - String canonicalName = modelClass.getCanonicalName(); - if (canonicalName == null) { - throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels"); - } - return get(DEFAULT_KEY + ":" + canonicalName, modelClass); + public open operator fun get(modelClass: Class): T { + val canonicalName = modelClass.canonicalName + ?: throw IllegalArgumentException("Local and anonymous classes can not be ViewModels") + return get("$DEFAULT_KEY:$canonicalName", modelClass) } /** * Returns an existing ViewModel or creates a new one in the scope (usually, a fragment or - * an activity), associated with this {@code ViewModelProvider}. - *

+ * an activity), associated with this `ViewModelProvider`. + * * The created ViewModel is associated with the given scope and will be retained * as long as the scope is alive (e.g. if it is an activity, until it is * finished or process is killed). * * @param key The key to use to identify the ViewModel. * @param modelClass The class of the ViewModel to create an instance of it if it is not - * present. - * @param The type parameter for the ViewModel. - * @return A ViewModel that is an instance of the given type {@code T}. + * present. + * @return A ViewModel that is an instance of the given type `T`. */ - @SuppressWarnings("unchecked") - @NonNull + @Suppress("UNCHECKED_CAST") @MainThread - public T get(@NonNull String key, @NonNull Class modelClass) { - ViewModel viewModel = mViewModelStore.get(key); - + public open operator fun get(key: String, modelClass: Class): T { + var viewModel = store[key] if (modelClass.isInstance(viewModel)) { - if (mFactory instanceof OnRequeryFactory) { - ((OnRequeryFactory) mFactory).onRequery(viewModel); - } - return (T) viewModel; + (factory as? OnRequeryFactory)?.onRequery(viewModel) + return viewModel as T } else { - //noinspection StatementWithEmptyBody + @Suppress("ControlFlowWithEmptyBody") if (viewModel != null) { // TODO: log a warning. } } - if (mFactory instanceof KeyedFactory) { - viewModel = ((KeyedFactory) mFactory).create(key, modelClass); + viewModel = if (factory is KeyedFactory) { + factory.create(key, modelClass) } else { - viewModel = mFactory.create(modelClass); + factory.create(modelClass) } - mViewModelStore.put(key, viewModel); - return (T) viewModel; + store.put(key, viewModel) + return viewModel } /** * Simple factory, which calls empty constructor on the give class. */ - public static class NewInstanceFactory implements Factory { - - private static NewInstanceFactory sInstance; - - /** - * Retrieve a singleton instance of NewInstanceFactory. - * - * @return A valid {@link NewInstanceFactory} - */ - @NonNull - static NewInstanceFactory getInstance() { - if (sInstance == null) { - sInstance = new NewInstanceFactory(); + // actually there is getInstance() + @Suppress("SingletonConstructor") + public open class NewInstanceFactory : Factory { + @Suppress("DocumentExceptions") + override fun create(modelClass: Class): T { + return try { + modelClass.newInstance() + } catch (e: InstantiationException) { + throw RuntimeException("Cannot create an instance of $modelClass", e) + } catch (e: IllegalAccessException) { + throw RuntimeException("Cannot create an instance of $modelClass", e) } - return sInstance; } - @SuppressWarnings("ClassNewInstance") - @NonNull - @Override - public T create(@NonNull Class modelClass) { - //noinspection TryWithIdenticalCatches - try { - return modelClass.newInstance(); - } catch (InstantiationException e) { - throw new RuntimeException("Cannot create an instance of " + modelClass, e); - } catch (IllegalAccessException e) { - throw new RuntimeException("Cannot create an instance of " + modelClass, e); - } + public companion object { + private var sInstance: NewInstanceFactory? = null + + /** + * @suppress + * Retrieve a singleton instance of NewInstanceFactory. + * + * @return A valid [NewInstanceFactory] + */ + @JvmStatic + public val instance: NewInstanceFactory + @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) + get() { + if (sInstance == null) { + sInstance = NewInstanceFactory() + } + return sInstance!! + } } } /** - * {@link Factory} which may create {@link AndroidViewModel} and - * {@link ViewModel}, which have an empty constructor. + * [Factory] which may create [AndroidViewModel] and + * [ViewModel], which have an empty constructor. + * + * @param application an application to pass in [AndroidViewModel] */ - public static class AndroidViewModelFactory extends ViewModelProvider.NewInstanceFactory { - - private static AndroidViewModelFactory sInstance; - - /** - * Retrieve a singleton instance of AndroidViewModelFactory. - * - * @param application an application to pass in {@link AndroidViewModel} - * @return A valid {@link AndroidViewModelFactory} - */ - @NonNull - public static AndroidViewModelFactory getInstance(@NonNull Application application) { - if (sInstance == null) { - sInstance = new AndroidViewModelFactory(application); - } - return sInstance; + public open class AndroidViewModelFactory( + private val application: Application + ) : NewInstanceFactory() { + @Suppress("DocumentExceptions") + override fun create(modelClass: Class): T { + return if (AndroidViewModel::class.java.isAssignableFrom(modelClass)) { + try { + modelClass.getConstructor(Application::class.java).newInstance(application) + } catch (e: NoSuchMethodException) { + throw RuntimeException("Cannot create an instance of $modelClass", e) + } catch (e: IllegalAccessException) { + throw RuntimeException("Cannot create an instance of $modelClass", e) + } catch (e: InstantiationException) { + throw RuntimeException("Cannot create an instance of $modelClass", e) + } catch (e: InvocationTargetException) { + throw RuntimeException("Cannot create an instance of $modelClass", e) + } + } else super.create(modelClass) } - private Application mApplication; + public companion object { + internal fun defaultFactory(owner: ViewModelStoreOwner): Factory = + if (owner is HasDefaultViewModelProviderFactory) + owner.defaultViewModelProviderFactory else instance - /** - * Creates a {@code AndroidViewModelFactory} - * - * @param application an application to pass in {@link AndroidViewModel} - */ - public AndroidViewModelFactory(@NonNull Application application) { - mApplication = application; - } + internal const val DEFAULT_KEY = "androidx.lifecycle.ViewModelProvider.DefaultKey" - @NonNull - @Override - public T create(@NonNull Class modelClass) { - if (AndroidViewModel.class.isAssignableFrom(modelClass)) { - //noinspection TryWithIdenticalCatches - try { - return modelClass.getConstructor(Application.class).newInstance(mApplication); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Cannot create an instance of " + modelClass, e); - } catch (IllegalAccessException e) { - throw new RuntimeException("Cannot create an instance of " + modelClass, e); - } catch (InstantiationException e) { - throw new RuntimeException("Cannot create an instance of " + modelClass, e); - } catch (InvocationTargetException e) { - throw new RuntimeException("Cannot create an instance of " + modelClass, e); + private var sInstance: AndroidViewModelFactory? = null + + /** + * Retrieve a singleton instance of AndroidViewModelFactory. + * + * @param application an application to pass in [AndroidViewModel] + * @return A valid [AndroidViewModelFactory] + */ + @JvmStatic + public fun getInstance(application: Application): AndroidViewModelFactory { + if (sInstance == null) { + sInstance = AndroidViewModelFactory(application) } + return sInstance!! } - return super.create(modelClass); } } } diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt index d80e8cb065b1d..24097d08c271f 100644 --- a/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt +++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt @@ -204,7 +204,7 @@ public class NavBackStackEntry private constructor( defaultArgs: Bundle? ) : AbstractSavedStateViewModelFactory(owner, defaultArgs) { @Suppress("UNCHECKED_CAST") - override fun create( + override fun create( key: String, modelClass: Class, handle: SavedStateHandle diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt index 4534b3a4dab33..322487151a8f8 100644 --- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt +++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavControllerViewModel.kt @@ -67,7 +67,7 @@ internal class NavControllerViewModel : ViewModel(), NavViewModelStoreProvider { companion object { private val FACTORY: ViewModelProvider.Factory = object : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { + override fun create(modelClass: Class): T { return NavControllerViewModel() as T } }