Make ConnectionFactory injectable

This commit is contained in:
Paul Schaub 2020-06-06 18:54:56 +02:00
parent 47a298af2f
commit c3b3384df6
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
5 changed files with 59 additions and 26 deletions

View File

@ -1,6 +1,7 @@
package org.mercury_im.messenger.android.di.component; package org.mercury_im.messenger.android.di.component;
import org.mercury_im.messenger.android.MercuryImApplication; import org.mercury_im.messenger.android.MercuryImApplication;
import org.mercury_im.messenger.core.di.module.XmppTcpConnectionFactoryModule;
import org.mercury_im.messenger.data.di.RepositoryModule; import org.mercury_im.messenger.data.di.RepositoryModule;
import org.mercury_im.messenger.android.di.module.AndroidPersistenceModule; import org.mercury_im.messenger.android.di.module.AndroidPersistenceModule;
import org.mercury_im.messenger.android.di.module.AppModule; import org.mercury_im.messenger.android.di.module.AppModule;
@ -35,7 +36,8 @@ import dagger.Component;
AppModule.class, AppModule.class,
AndroidPersistenceModule.class, AndroidPersistenceModule.class,
RepositoryModule.class, RepositoryModule.class,
ViewModelModule.class ViewModelModule.class,
XmppTcpConnectionFactoryModule.class
}) })
public interface AppComponent { public interface AppComponent {

View File

@ -0,0 +1,19 @@
package org.mercury_im.messenger.core.di.module;
import org.mercury_im.messenger.core.xmpp.XmppConnectionFactory;
import org.mercury_im.messenger.core.xmpp.XmppTcpConnectionFactory;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
public class XmppTcpConnectionFactoryModule {
@Provides
@Singleton
static XmppConnectionFactory provideConnectionFactory() {
return new XmppTcpConnectionFactory();
}
}

View File

@ -37,7 +37,7 @@ import io.reactivex.subjects.BehaviorSubject;
public class MercuryConnectionManager { public class MercuryConnectionManager {
private static final Logger LOGGER = Logger.getLogger("ConnectionManager"); private static final Logger LOGGER = Logger.getLogger("ConnectionManager");
private static final XmppConnectionFactory connectionFactory = new XmppConnectionFactory(); private final XmppConnectionFactory connectionFactory;
private final AccountRepository accountRepository; private final AccountRepository accountRepository;
private final RosterStoreBinder rosterStoreBinder; private final RosterStoreBinder rosterStoreBinder;
@ -60,13 +60,15 @@ public class MercuryConnectionManager {
@Inject @Inject
public MercuryConnectionManager(Repositories repositories, public MercuryConnectionManager(Repositories repositories,
RosterStoreBinder rosterStoreBinder, RosterStoreBinder rosterStoreBinder,
MercuryEntityCapsStore entityCapsStore) { MercuryEntityCapsStore entityCapsStore,
XmppConnectionFactory connectionFactory) {
this.accountRepository = repositories.getAccountRepository(); this.accountRepository = repositories.getAccountRepository();
this.rosterStoreBinder = rosterStoreBinder; this.rosterStoreBinder = rosterStoreBinder;
this.entityCapsStore = entityCapsStore; this.entityCapsStore = entityCapsStore;
this.peerRepository = repositories.getPeerRepository(); this.peerRepository = repositories.getPeerRepository();
this.directChatRepository = repositories.getDirectChatRepository(); this.directChatRepository = repositories.getDirectChatRepository();
this.messageRepository = repositories.getMessageRepository(); this.messageRepository = repositories.getMessageRepository();
this.connectionFactory = connectionFactory;
EntityCapsManager.setPersistentCache(entityCapsStore); EntityCapsManager.setPersistentCache(entityCapsStore);
start(); start();

View File

@ -1,31 +1,10 @@
package org.mercury_im.messenger.core.xmpp; package org.mercury_im.messenger.core.xmpp;
import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smack.util.TLSUtils;
import org.jxmpp.stringprep.XmppStringprepException;
import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.Account;
public class XmppConnectionFactory { public interface XmppConnectionFactory {
private static final int CONNECTION_TIMEOUT = 30 * 1000; AbstractXMPPConnection createConnection(Account account);
public AbstractXMPPConnection createConnection(Account account) {
try {
XMPPTCPConnectionConfiguration.Builder configBuilder =
XMPPTCPConnectionConfiguration.builder()
.setConnectTimeout(CONNECTION_TIMEOUT)
.setXmppAddressAndPassword(account.getAddress(), account.getPassword());
if (account.getHost() != null) {
configBuilder.setHost(account.getHost());
}
if (account.getPort() != 0) {
configBuilder.setPort(account.getPort());
}
return new XMPPTCPConnection(configBuilder.build());
} catch (XmppStringprepException e) {
throw new AssertionError("Account has invalid address: " + account.getAddress(), e);
}
}
} }

View File

@ -0,0 +1,31 @@
package org.mercury_im.messenger.core.xmpp;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smack.util.TLSUtils;
import org.jxmpp.stringprep.XmppStringprepException;
import org.mercury_im.messenger.entity.Account;
public class XmppTcpConnectionFactory implements XmppConnectionFactory {
private static final int CONNECTION_TIMEOUT = 30 * 1000;
public AbstractXMPPConnection createConnection(Account account) {
try {
XMPPTCPConnectionConfiguration.Builder configBuilder =
XMPPTCPConnectionConfiguration.builder()
.setConnectTimeout(CONNECTION_TIMEOUT)
.setXmppAddressAndPassword(account.getAddress(), account.getPassword());
if (account.getHost() != null) {
configBuilder.setHost(account.getHost());
}
if (account.getPort() != 0) {
configBuilder.setPort(account.getPort());
}
return new XMPPTCPConnection(configBuilder.build());
} catch (XmppStringprepException e) {
throw new AssertionError("Account has invalid address: " + account.getAddress(), e);
}
}
}