Refactor ApplicationDependencies.
This commit is contained in:
parent
116bd41c63
commit
3849b46f0a
3 changed files with 85 additions and 78 deletions
|
@ -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() {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue