Rewrite ViewModelProvider to kotlin
Test: Existing tests pass
Relnote: """*Source-breaking change* ViewModelProvider was written to Kotlin.
`ViewModelProvider.Factory.create` method doesn't allow nullable
generics anymore.
"""
Change-Id: I9b9f6617dc9377bc99a954eb096194b1240c98fe
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 566c2ab..67043c8 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 @@
class GreetingViewModelFactory(private val userId: String) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return GreetingViewModel(userId) as T
}
}
@@ -211,7 +211,7 @@
}
private class GreetingViewModelFactory(private val userId: String) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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 12e0b2f..d88bcba 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 @@
`when`(mockViewModel.getUserName()).thenReturn(fakeUserName)
val viewModelFactory = object : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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 8e799df..265acc6 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 @@
internal val FACTORY: ViewModelProvider.Factory =
object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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 67ae872..875b198 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 FakeViewModelProviderFactory : ViewModelProvider.Factory {
private var createCalled: Boolean = false
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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 9cfd0c9..71f909d 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 CountingFactory : ViewModelProvider.NewInstanceFactory() {
var count = 0
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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 e4a868d..5836e95 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 FakeViewModelProviderFactory : ViewModelProvider.Factory {
var createCalled = false
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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 97%
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 444831b..e87e103 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 @@
}
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 44d4d0b..9a9b016 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 @@
@Suppress("UNCHECKED_CAST")
class TestFactory : ViewModelProvider.Factory {
- override fun <T : ViewModel?> create(modelClass: Class<T>): T = TestVM("spb") as T
+
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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 0000000..f85d9e1
--- /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<T>):
+ Removed method androidx.lifecycle.SavedStateViewModelFactory.create(Class<T>)
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
index 0d02bcb..669dd6e 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 extends androidx.lifecycle.ViewModel> T create(String, Class<T!>);
method public final <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
@@ -22,11 +22,10 @@
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 extends androidx.lifecycle.ViewModel> T create(String, Class<T!>);
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
}
}
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 8d91832..ee5f16f 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 @@
val savedStateVMFactory = object : AbstractSavedStateViewModelFactory(
activity, null
) {
- override fun <T : ViewModel?> create(
+ override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
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 a05ae3d..bb6605f 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 @@
SavedStateViewModelFactory(activity.application, savedStateOwner) as Factory
} else {
object : AbstractSavedStateViewModelFactory(savedStateOwner, null) {
- override fun <T : ViewModel?> create(
+ override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
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 4eccdc3..d1438f9 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 @@
protected abstract <T extends ViewModel> T create(@NonNull String key,
@NonNull Class<T> 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 37fd9e9..7dc7b0d 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 @@
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 8582fa1..8b1db86c 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<T>):
- 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<T>):
- 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 1a5b37e..2668991 100644
--- a/lifecycle/lifecycle-viewmodel/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/current.txt
@@ -16,25 +16,34 @@
}
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 extends androidx.lifecycle.ViewModel> T get(Class<T!>);
- method @MainThread public <T extends androidx.lifecycle.ViewModel> T get(String, Class<T!>);
+ 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 extends androidx.lifecycle.ViewModel> T get(Class<T> modelClass);
+ method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(String key, Class<T> 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 extends androidx.lifecycle.ViewModel> T create(Class<T!>);
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
}
public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
ctor public ViewModelProvider.NewInstanceFactory();
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> 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 1a5b37e..2668991 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 @@
}
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 extends androidx.lifecycle.ViewModel> T get(Class<T!>);
- method @MainThread public <T extends androidx.lifecycle.ViewModel> T get(String, Class<T!>);
+ 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 extends androidx.lifecycle.ViewModel> T get(Class<T> modelClass);
+ method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(String key, Class<T> 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 extends androidx.lifecycle.ViewModel> T create(Class<T!>);
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
}
public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
ctor public ViewModelProvider.NewInstanceFactory();
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> 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 1a5b37e..27904ad 100644
--- a/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
@@ -16,25 +16,46 @@
}
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 extends androidx.lifecycle.ViewModel> T get(Class<T!>);
- method @MainThread public <T extends androidx.lifecycle.ViewModel> T get(String, Class<T!>);
+ 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 extends androidx.lifecycle.ViewModel> T get(Class<T> modelClass);
+ method @MainThread public operator <T extends androidx.lifecycle.ViewModel> T get(String key, Class<T> 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 extends androidx.lifecycle.ViewModel> T create(Class<T!>);
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> 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 extends androidx.lifecycle.ViewModel> T create(String key, Class<T> modelClass);
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
}
public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
ctor public ViewModelProvider.NewInstanceFactory();
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
+ method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> 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 50abd68..ca85890 100644
--- a/lifecycle/lifecycle-viewmodel/build.gradle
+++ b/lifecycle/lifecycle-viewmodel/build.gradle
@@ -32,7 +32,7 @@
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 1db6658..dea6695 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 cb24a1a..9911c2a 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.
- * <p>
- * 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}.
- * <p>
+ * Creates a new instance of the given `Class`.
*
- * @param modelClass a {@code Class} whose instance is requested
- * @param <T> The type parameter for the ViewModel.
+ * @param modelClass a `Class` whose instance is requested
* @return a newly created ViewModel
*/
- @NonNull
- <T extends ViewModel> T create(@NonNull Class<T> modelClass);
- }
-
- static class OnRequeryFactory {
- void onRequery(@NonNull ViewModel viewModel) {
- }
+ public fun <T : ViewModel> create(modelClass: Class<T>): T
}
/**
- * Implementations of {@code Factory} interface are responsible to instantiate ViewModels.
- * <p>
- * This is more advanced version of {@link Factory} that receives a key specified for requested
- * {@link ViewModel}.
+ * @suppress
*/
- abstract static class KeyedFactory extends OnRequeryFactory implements Factory {
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ public open class OnRequeryFactory {
+ public open fun onRequery(viewModel: 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
+ */
+ @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 <T> The type parameter for the ViewModel.
+ * @param modelClass a `Class` whose instance is requested
* @return a newly created ViewModel
*/
- @NonNull
- public abstract <T extends ViewModel> T create(@NonNull String key,
- @NonNull Class<T> modelClass);
+ public abstract fun <T : ViewModel> create(
+ key: String,
+ modelClass: Class<T>
+ ): T
- @NonNull
- @Override
- public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
- throw new UnsupportedOperationException("create(String, Class<?>) must be called on "
- + "implementaions of KeyedFactory");
+ override fun <T : ViewModel> create(modelClass: Class<T>): 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}.
- * <p>
+ * Creates `ViewModelProvider`. This will create `ViewModels`
+ * and retain them in a store of the given `ViewModelStoreOwner`.
+ *
+ *
* This method will use the
- * {@link HasDefaultViewModelProviderFactory#getDefaultViewModelProviderFactory() default factory}
- * if the owner implements {@link HasDefaultViewModelProviderFactory}. Otherwise, a
- * {@link NewInstanceFactory} will be used.
+ * [default factory][HasDefaultViewModelProviderFactory.getDefaultViewModelProviderFactory]
+ * if the owner implements [HasDefaultViewModelProviderFactory]. Otherwise, a
+ * [NewInstanceFactory] will be used.
*/
- public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
- this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory
- ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
- : NewInstanceFactory.getInstance());
- }
+ 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 a store of the given {@code ViewModelStoreOwner}.
+ * Creates `ViewModelProvider`, which will create `ViewModels` via the given
+ * `Factory` 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}
+ * @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 ViewModelStoreOwner owner, @NonNull Factory factory) {
- this(owner.getViewModelStore(), factory);
- }
-
- /**
- * Creates {@code ViewModelProvider}, which will create {@code ViewModels} via the given
- * {@code Factory} and retain them in the given {@code store}.
- *
- * @param store {@code ViewModelStore} where ViewModels will be stored.
- * @param factory factory a {@code Factory} which will be used to instantiate
- * new {@code 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}.
- * <p>
+ * 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 <T> 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 extends ViewModel> T get(@NonNull Class<T> 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 <T : ViewModel> get(modelClass: Class<T>): 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}.
- * <p>
+ * 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 <T> 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 extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
- ViewModel viewModel = mViewModelStore.get(key);
-
+ public open operator fun <T : ViewModel> get(key: String, modelClass: Class<T>): 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 <T : ViewModel> create(modelClass: Class<T>): 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 extends ViewModel> T create(@NonNull Class<T> 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;
- }
-
- private Application mApplication;
-
- /**
- * Creates a {@code AndroidViewModelFactory}
- *
- * @param application an application to pass in {@link AndroidViewModel}
- */
- public AndroidViewModelFactory(@NonNull Application application) {
- mApplication = application;
- }
-
- @NonNull
- @Override
- public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
- if (AndroidViewModel.class.isAssignableFrom(modelClass)) {
- //noinspection TryWithIdenticalCatches
+ public open class AndroidViewModelFactory(
+ private val application: Application
+ ) : NewInstanceFactory() {
+ @Suppress("DocumentExceptions")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return if (AndroidViewModel::class.java.isAssignableFrom(modelClass)) {
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);
+ 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)
+ }
+
+ public companion object {
+ internal fun defaultFactory(owner: ViewModelStoreOwner): Factory =
+ if (owner is HasDefaultViewModelProviderFactory)
+ owner.defaultViewModelProviderFactory else instance
+
+ internal const val DEFAULT_KEY = "androidx.lifecycle.ViewModelProvider.DefaultKey"
+
+ 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 d80e8cb..24097d0 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 @@
defaultArgs: Bundle?
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel?> create(
+ override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
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 4534b3a..3224871 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 @@
companion object {
private val FACTORY: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel?> create(modelClass: Class<T>): T {
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
return NavControllerViewModel() as T
}
}