Fix NPEs in repositories

This commit is contained in:
Paul Schaub 2019-12-06 20:25:33 +01:00
parent c2b1d794b7
commit 40a14abe02
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
11 changed files with 91 additions and 42 deletions

View file

@ -9,6 +9,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Build;
import org.mercury_im.messenger.data.di.MappingModule;
import org.mercury_im.messenger.data.di.RepositoryModule;
import org.mercury_im.messenger.di.component.AppComponent;
import org.mercury_im.messenger.di.component.DaggerAppComponent;
@ -72,7 +73,6 @@ public class MercuryImApplication extends Application {
public AppComponent createAppComponent() {
AppComponent appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.repositoryModule(new RepositoryModule())
.build();
appComponent.inject(this);

View file

@ -1,6 +1,7 @@
package org.mercury_im.messenger.di.component;
import org.mercury_im.messenger.MercuryImApplication;
import org.mercury_im.messenger.data.di.MappingModule;
import org.mercury_im.messenger.data.di.RepositoryModule;
import org.mercury_im.messenger.di.module.AndroidPersistenceModule;
import org.mercury_im.messenger.di.module.AppModule;
@ -28,20 +29,11 @@ import dagger.Component;
@Component(
modules = {
AppModule.class,
AndroidPersistenceModule.class
AndroidPersistenceModule.class,
RepositoryModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
AppComponent build();
Builder appModule(AppModule appModule);
Builder repositoryModule(RepositoryModule module);
}
// Application
void inject(MercuryImApplication mercuryImApplication);

View file

@ -0,0 +1,23 @@
package org.mercury_im.messenger.data.di;
import org.mercury_im.messenger.data.repository.XmppAccountRepository;
import org.mercury_im.messenger.data.repository.XmppDirectChatRepository;
import org.mercury_im.messenger.data.repository.XmppGroupChatRepository;
import org.mercury_im.messenger.data.repository.XmppPeerRepository;
import dagger.Component;
@Component(modules = {
RepositoryModule.class
})
public interface RepositoryComponent {
void inject(XmppAccountRepository accountRepository);
void inject(XmppPeerRepository peerRepository);
void inject(XmppDirectChatRepository directChatRepository);
void inject(XmppGroupChatRepository groupChatRepository);
}

View file

@ -1,11 +1,17 @@
package org.mercury_im.messenger.data.di;
import org.mercury_im.messenger.data.mapping.AccountMapping;
import org.mercury_im.messenger.data.mapping.DirectChatMapping;
import org.mercury_im.messenger.data.mapping.GroupChatMapping;
import org.mercury_im.messenger.data.mapping.PeerMapping;
import org.mercury_im.messenger.data.repository.AccountRepository;
import org.mercury_im.messenger.data.repository.GroupChatRepository;
import org.mercury_im.messenger.data.repository.PeerRepository;
import org.mercury_im.messenger.data.repository.DirectChatRepository;
import org.mercury_im.messenger.data.repository.EntityCapsRepository;
import org.mercury_im.messenger.data.repository.XmppAccountRepository;
import org.mercury_im.messenger.data.repository.XmppDirectChatRepository;
import org.mercury_im.messenger.data.repository.XmppGroupChatRepository;
import org.mercury_im.messenger.data.repository.XmppPeerRepository;
import org.mercury_im.messenger.util.ThreadUtils;
@ -26,17 +32,41 @@ public class RepositoryModule {
public static AccountRepository provideAccountRepository(
ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) {
return new XmppAccountRepository(data, ioScheduler, uiScheduler);
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler,
AccountMapping accountMapping) {
return new XmppAccountRepository(data, ioScheduler, uiScheduler, accountMapping);
}
@Provides
@Singleton
public static DirectChatRepository provideChatRepository(
public static PeerRepository providePeerRepository(
ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) {
return new XmppDirectChatRepository(data, ioScheduler, uiScheduler);
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler,
PeerMapping peerMapping) {
return new XmppPeerRepository(data, ioScheduler, uiScheduler, peerMapping);
}
@Provides
@Singleton
public static DirectChatRepository provideDirectChatRepository(
ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler,
AccountMapping accountMapping,
PeerMapping peerMapping,
DirectChatMapping directChatMapping) {
return new XmppDirectChatRepository(data, ioScheduler, uiScheduler, accountMapping, peerMapping, directChatMapping);
}
@Provides
@Singleton
public static GroupChatRepository provideGroupChatRepository(
ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler,
GroupChatMapping groupChatMapping) {
return new XmppGroupChatRepository(data, ioScheduler, uiScheduler, groupChatMapping);
}
@Provides
@ -48,12 +78,5 @@ public class RepositoryModule {
return new EntityCapsRepository(data, ioScheduler, uiScheduler);
}
@Provides
@Singleton
public static PeerRepository provideRosterRepository(
ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler ioScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler uiScheduler) {
return new XmppPeerRepository(data, ioScheduler, uiScheduler);
}
}

View file

@ -26,14 +26,15 @@ public class XmppAccountRepository
extends RequeryRepository
implements AccountRepository {
@Inject
AccountMapping accountMapping;
private final AccountMapping accountMapping;
@Inject
public XmppAccountRepository(ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) {
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler,
AccountMapping accountMapping) {
super(data, subscriberScheduler, observerScheduler);
this.accountMapping = accountMapping;
}
@Override

View file

@ -30,21 +30,24 @@ public class XmppDirectChatRepository
extends RequeryRepository
implements DirectChatRepository {
@Inject
AccountMapping accountMapping;
private final AccountMapping accountMapping;
@Inject
PeerMapping peerMapping;
private final PeerMapping peerMapping;
@Inject
DirectChatMapping directChatMapping;
private final DirectChatMapping directChatMapping;
@Inject
public XmppDirectChatRepository(
ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) {
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler,
AccountMapping accountMapping,
PeerMapping peerMapping,
DirectChatMapping directChatMapping) {
super(data, subscriberScheduler, observerScheduler);
this.accountMapping = accountMapping;
this.peerMapping = peerMapping;
this.directChatMapping = directChatMapping;
}

View file

@ -28,15 +28,16 @@ public class XmppGroupChatRepository
extends RequeryRepository
implements GroupChatRepository {
@Inject
GroupChatMapping groupChatMapping;
private final GroupChatMapping groupChatMapping;
@Inject
public XmppGroupChatRepository(
ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) {
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler,
GroupChatMapping groupChatMapping) {
super(data, subscriberScheduler, observerScheduler);
this.groupChatMapping = groupChatMapping;
}
@Override

View file

@ -29,14 +29,15 @@ public class XmppPeerRepository
@Inject
AccountRepository accountRepository;
@Inject
PeerMapping peerMapping;
private final PeerMapping peerMapping;
@Inject
public XmppPeerRepository(ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) {
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler,
PeerMapping peerMapping) {
super(data, subscriberScheduler, observerScheduler);
this.peerMapping = peerMapping;
}
@Override

View file

@ -8,7 +8,6 @@ import dagger.Component;
@Component(modules = {
RepositoryModule.class,
MappingModule.class,
TestDatabaseModule.class,
TestingSchedulerModule.class
})

View file

@ -61,5 +61,7 @@ public class AccountRepositoryTest {
DirectChat chatModel = directChatRepository.insertDirectChat(directChat)
.blockingGet();
assertEquals(1, chatModel.getId());
dataStore.close();
}
}

View file

@ -16,6 +16,10 @@ public interface DirectChatRepository {
Single<DirectChat> insertDirectChat(DirectChat chat);
default Observable<Optional<DirectChat>> observeDirectChat(DirectChat chat) {
return observeDirectChat(chat.getId());
}
Observable<Optional<DirectChat>> observeDirectChat(long chatId);
Maybe<DirectChat> getDirectChat(long chatId);