Fixed
Status Update
Comments
da...@google.com <da...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-master-dev
commit b90079595f33f58fece04026a97faa0d243acdb1
Author: Yuichi Araki <yaraki@google.com>
Date: Wed Sep 18 16:55:49 2019
Change the way to detect mismatch between POJO and query
This fixes cursor mismatch warnings with expandProjection.
Bug: 140759491
Test: QueryMethodProcessorTest
Change-Id: I7659002e5e0d1ef60fc1af2a625c0c36da0664d8
M room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
M room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
M room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
M room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
M room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
https://android-review.googlesource.com/1123258
https://goto.google.com/android-sha1/b90079595f33f58fece04026a97faa0d243acdb1
Branch: androidx-master-dev
commit b90079595f33f58fece04026a97faa0d243acdb1
Author: Yuichi Araki <yaraki@google.com>
Date: Wed Sep 18 16:55:49 2019
Change the way to detect mismatch between POJO and query
This fixes cursor mismatch warnings with expandProjection.
Bug: 140759491
Test: QueryMethodProcessorTest
Change-Id: I7659002e5e0d1ef60fc1af2a625c0c36da0664d8
M room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
M room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
M room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
M room/compiler/src/test/kotlin/androidx/room/processor/QueryMethodProcessorTest.kt
M room/compiler/src/test/kotlin/androidx/room/testing/TestProcessor.kt
sp...@gmail.com <sp...@gmail.com> #3
sp...@gmail.com <sp...@gmail.com> #4
Project: platform/frameworks/support
Branch: androidx-master-dev
commit bdde5a1a970ddc9007b28de4aa29d60ffa588f08
Author: Yigit Boyar <yboyar@google.com>
Date: Thu Apr 16 16:47:05 2020
Re-factor how errors are dismissed when query is re-written
This CL changes how we handle errors/warnings if query is
re-written.
There was a bug in expandProjection where we would report warnings
for things that Room already fixes automatically ( b/140759491 ).
The solution to that problem (I7659002e5e0d1ef60fc1af2a625c0c36da0664d8)
solved it by deferring validating of columns until after re-write
decision is made. Unfortunately, this required changing PojoRowAdapter
to have a dummy mapping until it is validating, make it hard to use
as it does have a non-null mapping which is not useful.
This CL partially reverts that change and instead rely on the log
deferring logic we have in Context. This way, we don't need to break
the stability of PojoRowAdapter while still having the ability to
drop warnings that room fixes. This will also play nicer when we
have different query re-writing options that can use more information
about the query results.
Bug: 153387066
Bug: 140759491
Test: existing tests pass
Change-Id: I2ec967c763d33d7a3ff02c1a13c6953b460d1e5f
M room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
M room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
M room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
M room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
https://android-review.googlesource.com/1288456
Branch: androidx-master-dev
commit bdde5a1a970ddc9007b28de4aa29d60ffa588f08
Author: Yigit Boyar <yboyar@google.com>
Date: Thu Apr 16 16:47:05 2020
Re-factor how errors are dismissed when query is re-written
This CL changes how we handle errors/warnings if query is
re-written.
There was a bug in expandProjection where we would report warnings
for things that Room already fixes automatically (
The solution to that problem (I7659002e5e0d1ef60fc1af2a625c0c36da0664d8)
solved it by deferring validating of columns until after re-write
decision is made. Unfortunately, this required changing PojoRowAdapter
to have a dummy mapping until it is validating, make it hard to use
as it does have a non-null mapping which is not useful.
This CL partially reverts that change and instead rely on the log
deferring logic we have in Context. This way, we don't need to break
the stability of PojoRowAdapter while still having the ability to
drop warnings that room fixes. This will also play nicer when we
have different query re-writing options that can use more information
about the query results.
Bug: 153387066
Bug: 140759491
Test: existing tests pass
Change-Id: I2ec967c763d33d7a3ff02c1a13c6953b460d1e5f
M room/compiler/src/main/kotlin/androidx/room/log/RLog.kt
M room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
M room/compiler/src/main/kotlin/androidx/room/solver/TypeAdapterStore.kt
M room/compiler/src/main/kotlin/androidx/room/solver/query/result/PojoRowAdapter.kt
sp...@gmail.com <sp...@gmail.com> #5
the fragment is inflated from xml
<fragment
android:id="@+id/sentence_container"
android:name="com.sealstudios.simpleaac.ui.aac.SentenceFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/card_sentence_holder_height"
app:fragment_layout_identifier="@string/main"
app:layout_constraintTop_toTopOf="parent" />
<fragment
android:id="@+id/sentence_container"
android:name="com.sealstudios.simpleaac.ui.aac.SentenceFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/card_sentence_holder_height"
app:fragment_layout_identifier="@string/main"
app:layout_constraintTop_toTopOf="parent" />
sp...@gmail.com <sp...@gmail.com> #6
sorry copied the wrong line sentencesViewModel = new ViewModelProvider(getStoreOwner(), getDefaultViewModelProviderFactory()).get(SentencesViewModel.class);
da...@google.com <da...@google.com> #7
Is that ViewModel in another Gradle module? Make sure you apply the androidx.hilt-compiler
too all the those modules where you have your @InjectViewModel
. Do you notice any other difference of that SentencesViewModel? If you can share an app that reproduces the issue that would be great.
sp...@gmail.com <sp...@gmail.com> #8
no its not in another module, the view model is this (removed some stuff for brevity)
private final SentenceRepository sentenceRepository;
private final GroupRepository groupRepository;
@ViewModelInject
SentencesViewModel(SentenceRepository sentenceRepository, GroupRepository groupRepository, @Clicks int clicks, @SentenceTypeAndDescription String[] cardArgs){
this.sentenceRepository = sentenceRepository;
this.groupRepository = groupRepository;
}
the view model is built by a component
@Component(dependencies = SentenceViewModelDependencies.class)
public interface SentenceViewModelComponent {
void inject(CardHolderFragment cardHolderFragment);
@Component.Builder
interface Builder {
Builder context(@BindsInstance Context context);
Builder appDependencies(SentenceViewModelDependencies sentenceViewModelDependencies);
SentenceViewModelComponent build();
}
}
the component needs
@EntryPoint
@InstallIn(ApplicationComponent.class)
public interface SentenceViewModelDependencies {
@SentenceTypeAndDescription String[] sentenceTypeAndDescription();
}
and the view model needs
@Module
@InstallIn(ApplicationComponent.class)
public class SentenceClicksModule {
@Singleton
@Provides
@Clicks
public int provideSentenceClicks() {
return 5;
}
}
@Module
@InstallIn(ApplicationComponent.class)
public class SentenceRepositoryModule {
@Singleton
@Provides
public SentenceRepository provideSentenceRepository(@ApplicationContext Context context, DbHelper dbHelper) {
return new SentenceRepository(context, dbHelper);
}
}
@Module
@InstallIn(ApplicationComponent.class)
public class GroupRepositoryModule {
@Singleton
@Provides
public GroupRepository provideGroupRepository(DbHelper dbHelper) {
return new GroupRepository(dbHelper);
}
}
it was working before without any dependency injection
private final SentenceRepository sentenceRepository;
private final GroupRepository groupRepository;
@ViewModelInject
SentencesViewModel(SentenceRepository sentenceRepository, GroupRepository groupRepository, @Clicks int clicks, @SentenceTypeAndDescription String[] cardArgs){
this.sentenceRepository = sentenceRepository;
this.groupRepository = groupRepository;
}
the view model is built by a component
@Component(dependencies = SentenceViewModelDependencies.class)
public interface SentenceViewModelComponent {
void inject(CardHolderFragment cardHolderFragment);
@Component.Builder
interface Builder {
Builder context(@BindsInstance Context context);
Builder appDependencies(SentenceViewModelDependencies sentenceViewModelDependencies);
SentenceViewModelComponent build();
}
}
the component needs
@EntryPoint
@InstallIn(ApplicationComponent.class)
public interface SentenceViewModelDependencies {
@SentenceTypeAndDescription String[] sentenceTypeAndDescription();
}
and the view model needs
@Module
@InstallIn(ApplicationComponent.class)
public class SentenceClicksModule {
@Singleton
@Provides
@Clicks
public int provideSentenceClicks() {
return 5;
}
}
@Module
@InstallIn(ApplicationComponent.class)
public class SentenceRepositoryModule {
@Singleton
@Provides
public SentenceRepository provideSentenceRepository(@ApplicationContext Context context, DbHelper dbHelper) {
return new SentenceRepository(context, dbHelper);
}
}
@Module
@InstallIn(ApplicationComponent.class)
public class GroupRepositoryModule {
@Singleton
@Provides
public GroupRepository provideGroupRepository(DbHelper dbHelper) {
return new GroupRepository(dbHelper);
}
}
it was working before without any dependency injection
da...@google.com <da...@google.com> #9
Is SentenceFragment
annotated with @AndroidEntryPoint
? It looks like you have setup injection of it yourself vs letting Hilt inject it.
sp...@gmail.com <sp...@gmail.com> #10
yes its annotated, not sure what you mean how could i do it myself? rather than letting hilt do it? im fairly new to Hilt and dagger2 so its most probably something I'm not doing properly
ap...@google.com <ap...@google.com> #11
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 00068c24a9e483cc7a8f930e546a67b841c70382
Author: Daniel Santiago Rivera <danysantiago@google.com>
Date: Mon Aug 10 11:45:49 2020
Apply hilt-android-compiler to AndroidX's Hilt-common
The aggregating compiler has to be applied to the project
where the extension annotations are annotated with
@GeneratesRootInput so the aggregating data is generated
and therefore Hilt can correctly await for these to be
processed.
Relnote: "Fix an issue where AndroidX Hilt extension Modules would not get correctly picked up by Hilt causing ViewModels or Workers to not be available for creation."
Bug: 159540434
Test: Existing tests pass.
Change-Id: I3181c8aad0973d15d82661b48404f2eeeb7ef954
M hilt/hilt-common/build.gradle
https://android-review.googlesource.com/1395447
Branch: androidx-master-dev
commit 00068c24a9e483cc7a8f930e546a67b841c70382
Author: Daniel Santiago Rivera <danysantiago@google.com>
Date: Mon Aug 10 11:45:49 2020
Apply hilt-android-compiler to AndroidX's Hilt-common
The aggregating compiler has to be applied to the project
where the extension annotations are annotated with
@GeneratesRootInput so the aggregating data is generated
and therefore Hilt can correctly await for these to be
processed.
Relnote: "Fix an issue where AndroidX Hilt extension Modules would not get correctly picked up by Hilt causing ViewModels or Workers to not be available for creation."
Bug: 159540434
Test: Existing tests pass.
Change-Id: I3181c8aad0973d15d82661b48404f2eeeb7ef954
M hilt/hilt-common/build.gradle
da...@google.com <da...@google.com> #12
Sorry took a while since it was a bit hard to track. The next alpha version should contain contain a fix for this.
Description
Version used: com.google.dagger:hilt-android:2.28-alpha
Devices/Android versions reproduced on: nexus 5x emulator, android 9.0
If this is a bug in the library, we would appreciate if you could attach:
- Sample project to trigger the issue.
- A screenrecord or screenshots showing the issue (if UI related).
When creating a view model using the navigation scope i get an error stating that ViewModel has no zero argument constructor.
userViewModel = new ViewModelProvider(requireActivity()).get(UserViewModel.class); // works
userViewModel = new ViewModelProvider(getStoreOwner()).get(UserViewModel.class); // crashes
private ViewModelStoreOwner getStoreOwner() {
NavController navController = Navigation
.findNavController(requireActivity(), R.id.root_navigator_fragment);
if (layoutIdentifier.equals(Constants.MAIN_IDENTIFIER)) {
return navController.getViewModelStoreOwner(R.id.root_navigator);
} else {
return navController.getViewModelStoreOwner(R.id.MessageGraph);
}
}