Refactor ApplicationDependencies.

This commit is contained in:
Greyson Parrelli 2019-08-06 14:54:44 -04:00
parent 116bd41c63
commit 3849b46f0a
3 changed files with 85 additions and 78 deletions

View file

@ -234,7 +234,7 @@ public class ApplicationContext extends MultiDexApplication implements DefaultLi
} }
private void initializeAppDependencies() { private void initializeAppDependencies() {
ApplicationDependencies.init(new ApplicationDependencyProvider(this, new SignalServiceNetworkAccess(this))); ApplicationDependencies.init(this, new ApplicationDependencyProvider(this, new SignalServiceNetworkAccess(this)));
} }
private void initializeGcmCheck() { private void initializeGcmCheck() {

View file

@ -1,19 +1,22 @@
package org.thoughtcrime.securesms.dependencies; package org.thoughtcrime.securesms.dependencies;
import android.app.Application; import android.app.Application;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.IncomingMessageProcessor; import org.thoughtcrime.securesms.IncomingMessageProcessor;
import org.thoughtcrime.securesms.gcm.MessageRetriever; import org.thoughtcrime.securesms.gcm.MessageRetriever;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess; import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.service.IncomingMessageObserver;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.SignalServiceMessageSender;
/** /**
* Location for storing and retrieving application-scoped singletons. Users must call * Location for storing and retrieving application-scoped singletons. Users must call
* {@link #init(Provider)} before using any of the methods, preferably early on in * {@link #init(Application, Provider)} before using any of the methods, preferably early on in
* {@link Application#onCreate()}. * {@link Application#onCreate()}.
* *
* All future application-scoped singletons should be written as normal objects, then placed here * All future application-scoped singletons should be written as normal objects, then placed here
@ -21,61 +24,95 @@ import org.whispersystems.signalservice.api.SignalServiceMessageSender;
*/ */
public class ApplicationDependencies { public class ApplicationDependencies {
private static ApplicationDependencies instance; private static Application application;
private static Provider provider;
private final Provider provider; private static SignalServiceAccountManager accountManager;
private static SignalServiceMessageSender messageSender;
private static SignalServiceMessageReceiver messageReceiver;
private static IncomingMessageProcessor incomingMessageProcessor;
private static MessageRetriever messageRetriever;
private ApplicationDependencies(@NonNull Provider provider) { public static synchronized void init(@NonNull Application application, @NonNull Provider provider) {
this.provider = provider; if (ApplicationDependencies.application != null || ApplicationDependencies.provider != null) {
} throw new IllegalStateException("Already initialized!");
}
public static synchronized void init(@NonNull Provider provider) { ApplicationDependencies.application = application;
instance = new ApplicationDependencies(provider); ApplicationDependencies.provider = provider;
} }
public static synchronized @NonNull SignalServiceAccountManager getSignalServiceAccountManager() { public static synchronized @NonNull SignalServiceAccountManager getSignalServiceAccountManager() {
assertInitialization(); assertInitialization();
return instance.provider.getSignalServiceAccountManager();
if (accountManager == null) {
accountManager = provider.provideSignalServiceAccountManager();
}
return accountManager;
} }
public static synchronized @NonNull SignalServiceMessageSender getSignalServiceMessageSender() { public static synchronized @NonNull SignalServiceMessageSender getSignalServiceMessageSender() {
assertInitialization(); assertInitialization();
return instance.provider.getSignalServiceMessageSender();
if (messageSender == null) {
messageSender = provider.provideSignalServiceMessageSender();
} else {
messageSender.setMessagePipe(IncomingMessageObserver.getPipe(), IncomingMessageObserver.getUnidentifiedPipe());
messageSender.setIsMultiDevice(TextSecurePreferences.isMultiDevice(application));
}
return messageSender;
} }
public static synchronized @NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver() { public static synchronized @NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver() {
assertInitialization(); assertInitialization();
return instance.provider.getSignalServiceMessageReceiver();
if (messageReceiver == null) {
messageReceiver = provider.provideSignalServiceMessageReceiver();
}
return messageReceiver;
} }
public static synchronized @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() { public static synchronized @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() {
assertInitialization(); assertInitialization();
return instance.provider.getSignalServiceNetworkAccess(); return provider.provideSignalServiceNetworkAccess();
} }
public static synchronized @NonNull IncomingMessageProcessor getIncomingMessageProcessor() { public static synchronized @NonNull IncomingMessageProcessor getIncomingMessageProcessor() {
assertInitialization(); assertInitialization();
return instance.provider.getIncomingMessageProcessor();
if (incomingMessageProcessor == null) {
incomingMessageProcessor = provider.provideIncomingMessageProcessor();
}
return incomingMessageProcessor;
} }
public static synchronized @NonNull MessageRetriever getMessageRetriever() { public static synchronized @NonNull MessageRetriever getMessageRetriever() {
assertInitialization(); assertInitialization();
return instance.provider.getMessageRetriever();
if (messageRetriever == null) {
messageRetriever = provider.provideMessageRetriever();
}
return messageRetriever;
} }
private static void assertInitialization() { private static void assertInitialization() {
if (instance == null) { if (application == null || provider == null) {
throw new UninitializedException(); throw new UninitializedException();
} }
} }
public interface Provider { public interface Provider {
@NonNull SignalServiceAccountManager getSignalServiceAccountManager(); @NonNull SignalServiceAccountManager provideSignalServiceAccountManager();
@NonNull SignalServiceMessageSender getSignalServiceMessageSender(); @NonNull SignalServiceMessageSender provideSignalServiceMessageSender();
@NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver(); @NonNull SignalServiceMessageReceiver provideSignalServiceMessageReceiver();
@NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess(); @NonNull SignalServiceNetworkAccess provideSignalServiceNetworkAccess();
@NonNull IncomingMessageProcessor getIncomingMessageProcessor(); @NonNull IncomingMessageProcessor provideIncomingMessageProcessor();
@NonNull MessageRetriever getMessageRetriever(); @NonNull MessageRetriever provideMessageRetriever();
} }
private static class UninitializedException extends IllegalStateException { private static class UninitializedException extends IllegalStateException {

View file

@ -35,84 +35,54 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr
private final Context context; private final Context context;
private final SignalServiceNetworkAccess networkAccess; private final SignalServiceNetworkAccess networkAccess;
private SignalServiceAccountManager accountManager;
private SignalServiceMessageSender messageSender;
private SignalServiceMessageReceiver messageReceiver;
private IncomingMessageProcessor incomingMessageProcessor;
private MessageRetriever messageRetriever;
public ApplicationDependencyProvider(@NonNull Context context, @NonNull SignalServiceNetworkAccess networkAccess) { public ApplicationDependencyProvider(@NonNull Context context, @NonNull SignalServiceNetworkAccess networkAccess) {
this.context = context.getApplicationContext(); this.context = context.getApplicationContext();
this.networkAccess = networkAccess; this.networkAccess = networkAccess;
} }
@Override @Override
public @NonNull SignalServiceAccountManager getSignalServiceAccountManager() { public @NonNull SignalServiceAccountManager provideSignalServiceAccountManager() {
if (accountManager == null) { return new SignalServiceAccountManager(networkAccess.getConfiguration(context),
this.accountManager = new SignalServiceAccountManager(networkAccess.getConfiguration(context), new DynamicCredentialsProvider(context),
new DynamicCredentialsProvider(context), BuildConfig.USER_AGENT);
BuildConfig.USER_AGENT);
}
return accountManager;
} }
@Override @Override
public @NonNull SignalServiceMessageSender getSignalServiceMessageSender() { public @NonNull SignalServiceMessageSender provideSignalServiceMessageSender() {
if (this.messageSender == null) { return new SignalServiceMessageSender(networkAccess.getConfiguration(context),
this.messageSender = new SignalServiceMessageSender(networkAccess.getConfiguration(context), new DynamicCredentialsProvider(context),
new DynamicCredentialsProvider(context), new SignalProtocolStoreImpl(context),
new SignalProtocolStoreImpl(context), BuildConfig.USER_AGENT,
BuildConfig.USER_AGENT, TextSecurePreferences.isMultiDevice(context),
TextSecurePreferences.isMultiDevice(context), Optional.fromNullable(IncomingMessageObserver.getPipe()),
Optional.fromNullable(IncomingMessageObserver.getPipe()), Optional.fromNullable(IncomingMessageObserver.getUnidentifiedPipe()),
Optional.fromNullable(IncomingMessageObserver.getUnidentifiedPipe()), Optional.of(new SecurityEventListener(context)));
Optional.of(new SecurityEventListener(context)));
}else {
this.messageSender.setMessagePipe(IncomingMessageObserver.getPipe(), IncomingMessageObserver.getUnidentifiedPipe());
this.messageSender.setIsMultiDevice(TextSecurePreferences.isMultiDevice(context));
}
return this.messageSender;
} }
@Override @Override
public @NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver() { public @NonNull SignalServiceMessageReceiver provideSignalServiceMessageReceiver() {
if (this.messageReceiver == null) { SleepTimer sleepTimer = TextSecurePreferences.isFcmDisabled(context) ? new RealtimeSleepTimer(context)
SleepTimer sleepTimer = TextSecurePreferences.isFcmDisabled(context) ? new RealtimeSleepTimer(context) : new UptimeSleepTimer();
: new UptimeSleepTimer(); return new SignalServiceMessageReceiver(networkAccess.getConfiguration(context),
new DynamicCredentialsProvider(context),
this.messageReceiver = new SignalServiceMessageReceiver(networkAccess.getConfiguration(context), BuildConfig.USER_AGENT,
new DynamicCredentialsProvider(context), new PipeConnectivityListener(),
BuildConfig.USER_AGENT, sleepTimer);
new PipeConnectivityListener(),
sleepTimer);
}
return this.messageReceiver;
} }
@Override @Override
public @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() { public @NonNull SignalServiceNetworkAccess provideSignalServiceNetworkAccess() {
return networkAccess; return networkAccess;
} }
@Override @Override
public @NonNull IncomingMessageProcessor getIncomingMessageProcessor() { public @NonNull IncomingMessageProcessor provideIncomingMessageProcessor() {
if (incomingMessageProcessor == null) { return new IncomingMessageProcessor(context);
incomingMessageProcessor = new IncomingMessageProcessor(context);
}
return incomingMessageProcessor;
} }
@Override @Override
public @NonNull MessageRetriever getMessageRetriever() { public @NonNull MessageRetriever provideMessageRetriever() {
if (messageRetriever == null) { return new MessageRetriever();
messageRetriever = new MessageRetriever();
}
return messageRetriever;
} }
private static class DynamicCredentialsProvider implements CredentialsProvider { private static class DynamicCredentialsProvider implements CredentialsProvider {