Obsolete
Status Update
Comments
au...@google.com <au...@google.com> #2
I was able to repro in androidx, but creating a repro in metalava doesn't seem to work, so far this is the test I've written
@Test
fun `Adding default modifier to a method`() {
check(
expectedIssues = "",
format = FileFormat.V4,
checkCompatibilityApi = """
// Signature format: 4.0
package test.pkg {
public interface FirstClass {
method public <T extends java.lang.String> T! create(Class<T!>!);
}
public class SecondClass {
ctor public SecondClass();
method public <T extends java.lang.String> T! create(Class<T!>!);
}
}
""",
sourceFiles = arrayOf(
java("""
package test.pkg;
public interface FirstClass {
default <T extends String> T create(Class<T> modelClass) {
throw new UnsupportedOperationException();
}
}
"""),
java("""
package test.pkg;
public class SecondClass extends FirstClass {
@Override
public <T extends String> T create(Class<T> modelClass);
}
""")
)
)
}
au...@google.com <au...@google.com> #3
@sergeyv any idea what I'm missing here?
se...@google.com <se...@google.com> #4
Is it fine that your source file for SecondClass
doesn't contain implementation?
public class SecondClass extends FirstClass {
@Override
public <T extends String> T create(Class<T> modelClass); // implement me?
}
au...@google.com <au...@google.com> #5
I tried to go even closer to source for the test, but no luck
@Test
fun `Adding default modifier to a method`() {
check(
expectedIssues = "",
format = FileFormat.V4,
checkCompatibilityApi = """
// Signature format: 4.0
package test.pkg {
public abstract class ViewModel {
ctor public ViewModel();
}
public class ViewModelProvider {
ctor public ViewModelProvider();
}
public static interface ViewModelProvider.Factory {
method public <T extends test.pkg.ViewModel> T! create(Class<T!>!);
}
public static class ViewModelProvider.NewInstanceFactory implements test.pkg.ViewModelProvider.Factory {
ctor public ViewModelProvider.NewInstanceFactory();
method public <T extends test.pkg.ViewModel> T! create(Class<T!>!);
}
}
""",
sourceFiles = arrayOf(
java("""
package test.pkg;
public class ViewModelProvider {
public interface Factory {
default <T extends ViewModel> T create(Class<T> modelClass) {
throw new UnsupportedOperationException();
}
}
public static class NewInstanceFactory implements Factory {
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
return null;
}
}
}
"""),
java("""
package test.pkg;
public abstract class ViewModel {
}
""")
)
)
}
au...@google.com <au...@google.com> #6
It must have been a bug in old metalava, i'm unable to repro in androidx either now (I reverted 927300ff9fd87da629f28a56058b29750700c845 and ce18bf219466f2453cebb2a20bc4cef23a6a89bd, then changed ViewModelProvider.Factory
to default method.
ap...@google.com <ap...@google.com> #7
Project: platform/frameworks/support
Branch: androidx-main
commit 15d5a9df61e3b6f362046b29412913ef3aec10e0
Author: Sergey Vasilinets <sergeyv@google.com>
Date: Fri Jun 25 14:30:22 2021
Introduce CreationExtras
It also passes key associated with ViewModel
as an extra.
Metalava incorrectly says that this is a breaking change: b/188691010
Relnote: "ViewModelProvider.CreationExtras were introduced.
This API will simplify passing an additional information to ViewModelProvider.Factory"
bug: 188541057
Test: ViewModelProviderTest
Change-Id: Ia73439cb2282609a9a1eaebf8ba79b9cc93feb7c
M lifecycle/lifecycle-viewmodel/api/current.txt
M fragment/fragment/build.gradle
A lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt
M lifecycle/lifecycle-viewmodel/build.gradle
M lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
M lifecycle/lifecycle-viewmodel/api/restricted_current.txt
M fragment/fragment-testing/build.gradle
M compose/integration-tests/docs-snippets/build.gradle
M lifecycle/lifecycle-viewmodel-compose/build.gradle
M lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
M fragment/fragment-ktx/build.gradle
M activity/activity-ktx/build.gradle
A lifecycle/lifecycle-viewmodel-savedstate/api/current.ignore
M lifecycle/lifecycle-viewmodel-savedstate/build.gradle
M navigation/navigation-runtime/build.gradle
M navigation/navigation-dynamic-features-fragment/build.gradle
M lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
M lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
M lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
https://android-review.googlesource.com/1748315
Branch: androidx-main
commit 15d5a9df61e3b6f362046b29412913ef3aec10e0
Author: Sergey Vasilinets <sergeyv@google.com>
Date: Fri Jun 25 14:30:22 2021
Introduce CreationExtras
It also passes key associated with ViewModel
as an extra.
Metalava incorrectly says that this is a breaking change:
Relnote: "ViewModelProvider.CreationExtras were introduced.
This API will simplify passing an additional information to ViewModelProvider.Factory"
bug: 188541057
Test: ViewModelProviderTest
Change-Id: Ia73439cb2282609a9a1eaebf8ba79b9cc93feb7c
M lifecycle/lifecycle-viewmodel/api/current.txt
M fragment/fragment/build.gradle
A lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt
M lifecycle/lifecycle-viewmodel/build.gradle
M lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
M lifecycle/lifecycle-viewmodel/api/restricted_current.txt
M fragment/fragment-testing/build.gradle
M compose/integration-tests/docs-snippets/build.gradle
M lifecycle/lifecycle-viewmodel-compose/build.gradle
M lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
M fragment/fragment-ktx/build.gradle
M activity/activity-ktx/build.gradle
A lifecycle/lifecycle-viewmodel-savedstate/api/current.ignore
M lifecycle/lifecycle-viewmodel-savedstate/build.gradle
M navigation/navigation-runtime/build.gradle
M navigation/navigation-dynamic-features-fragment/build.gradle
M lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
M lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
M lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
Description
Steps to reproduce:
default
;default
disappears from existing classes that implement that interface;For example in
ViewModelProvider.Factory
mark a methodcreate
asdefault
:then run
./gradlew :lifec:lifec-view:updateApi
It will fail with: