Signal-Android/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java

300 lines
11 KiB
Java
Raw Normal View History

package org.thoughtcrime.securesms.dependencies;
import android.app.Application;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.KbsEnclave;
import org.thoughtcrime.securesms.messages.IncomingMessageProcessor;
import org.thoughtcrime.securesms.messages.BackgroundMessageRetriever;
2020-05-05 17:13:53 +02:00
import org.thoughtcrime.securesms.groups.GroupsV2AuthorizationMemoryValueCache;
2020-05-02 00:13:23 +02:00
import org.thoughtcrime.securesms.groups.v2.processing.GroupsV2StateProcessor;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.keyvalue.KeyValueStore;
2020-05-05 17:13:53 +02:00
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.megaphone.MegaphoneRepository;
2020-05-27 21:04:45 +02:00
import org.thoughtcrime.securesms.notifications.MessageNotifier;
import org.thoughtcrime.securesms.pin.KbsEnclaves;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.recipients.LiveRecipientCache;
import org.thoughtcrime.securesms.messages.IncomingMessageObserver;
2020-09-03 23:52:44 +02:00
import org.thoughtcrime.securesms.service.TrimThreadsByDateManager;
import org.thoughtcrime.securesms.util.EarlyMessageCache;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.FrameRateTracker;
2020-08-25 22:10:07 +02:00
import org.thoughtcrime.securesms.util.Hex;
import org.thoughtcrime.securesms.util.IasKeyStore;
2019-08-06 20:54:44 +02:00
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.signalservice.api.KeyBackupService;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import org.whispersystems.signalservice.api.SignalServiceMessageSender;
2020-05-05 17:13:53 +02:00
import org.thoughtcrime.securesms.groups.GroupsV2Authorization;
2020-04-01 19:33:23 +02:00
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
/**
* Location for storing and retrieving application-scoped singletons. Users must call
2019-08-06 20:54:44 +02:00
* {@link #init(Application, Provider)} before using any of the methods, preferably early on in
* {@link Application#onCreate()}.
*
* All future application-scoped singletons should be written as normal objects, then placed here
* to manage their singleton-ness.
*/
public class ApplicationDependencies {
2019-08-06 20:54:44 +02:00
private static Application application;
private static Provider provider;
2020-05-02 00:13:23 +02:00
private static SignalServiceAccountManager accountManager;
private static SignalServiceMessageSender messageSender;
private static SignalServiceMessageReceiver messageReceiver;
private static IncomingMessageObserver incomingMessageObserver;
2020-05-02 00:13:23 +02:00
private static IncomingMessageProcessor incomingMessageProcessor;
private static BackgroundMessageRetriever backgroundMessageRetriever;
2020-05-02 00:13:23 +02:00
private static LiveRecipientCache recipientCache;
private static JobManager jobManager;
private static FrameRateTracker frameRateTracker;
private static KeyValueStore keyValueStore;
private static MegaphoneRepository megaphoneRepository;
private static GroupsV2Authorization groupsV2Authorization;
private static GroupsV2StateProcessor groupsV2StateProcessor;
private static GroupsV2Operations groupsV2Operations;
private static EarlyMessageCache earlyMessageCache;
2020-05-27 21:04:45 +02:00
private static MessageNotifier messageNotifier;
2020-09-03 23:52:44 +02:00
private static TrimThreadsByDateManager trimThreadsByDateManager;
@MainThread
2019-08-06 20:54:44 +02:00
public static synchronized void init(@NonNull Application application, @NonNull Provider provider) {
if (ApplicationDependencies.application != null || ApplicationDependencies.provider != null) {
throw new IllegalStateException("Already initialized!");
}
2020-09-03 23:52:44 +02:00
ApplicationDependencies.application = application;
ApplicationDependencies.provider = provider;
ApplicationDependencies.messageNotifier = provider.provideMessageNotifier();
ApplicationDependencies.trimThreadsByDateManager = provider.provideTrimThreadsByDateManager();
}
public static @NonNull Application getApplication() {
assertInitialization();
return application;
}
public static synchronized @NonNull SignalServiceAccountManager getSignalServiceAccountManager() {
assertInitialization();
2019-08-06 20:54:44 +02:00
if (accountManager == null) {
accountManager = provider.provideSignalServiceAccountManager();
}
return accountManager;
}
2020-05-02 00:13:23 +02:00
public static synchronized @NonNull GroupsV2Authorization getGroupsV2Authorization() {
assertInitialization();
if (groupsV2Authorization == null) {
2020-05-05 17:13:53 +02:00
GroupsV2Authorization.ValueCache authCache = new GroupsV2AuthorizationMemoryValueCache(SignalStore.groupsV2AuthorizationCache());
groupsV2Authorization = new GroupsV2Authorization(getSignalServiceAccountManager().getGroupsV2Api(), authCache);
2020-05-02 00:13:23 +02:00
}
return groupsV2Authorization;
}
2020-04-07 22:55:33 +02:00
public static synchronized @NonNull GroupsV2Operations getGroupsV2Operations() {
assertInitialization();
if (groupsV2Operations == null) {
groupsV2Operations = provider.provideGroupsV2Operations();
}
return groupsV2Operations;
}
public static synchronized @NonNull KeyBackupService getKeyBackupService(@NonNull KbsEnclave enclave) {
return getSignalServiceAccountManager().getKeyBackupService(IasKeyStore.getIasKeyStore(application),
enclave.getEnclaveName(),
Hex.fromStringOrThrow(enclave.getServiceId()),
enclave.getMrEnclave(),
10);
}
2020-05-02 00:13:23 +02:00
public static synchronized @NonNull GroupsV2StateProcessor getGroupsV2StateProcessor() {
assertInitialization();
if (groupsV2StateProcessor == null) {
groupsV2StateProcessor = new GroupsV2StateProcessor(application);
}
return groupsV2StateProcessor;
}
public static synchronized @NonNull SignalServiceMessageSender getSignalServiceMessageSender() {
assertInitialization();
2019-08-06 20:54:44 +02:00
if (messageSender == null) {
messageSender = provider.provideSignalServiceMessageSender();
} else {
messageSender.update(
IncomingMessageObserver.getPipe(),
IncomingMessageObserver.getUnidentifiedPipe(),
2020-09-11 04:02:38 +02:00
TextSecurePreferences.isMultiDevice(application));
2019-08-06 20:54:44 +02:00
}
return messageSender;
}
public static synchronized @NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver() {
assertInitialization();
2019-08-06 20:54:44 +02:00
if (messageReceiver == null) {
messageReceiver = provider.provideSignalServiceMessageReceiver();
}
return messageReceiver;
}
public static synchronized void resetSignalServiceMessageReceiver() {
assertInitialization();
messageReceiver = null;
}
public static synchronized @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() {
assertInitialization();
2019-08-06 20:54:44 +02:00
return provider.provideSignalServiceNetworkAccess();
}
public static synchronized @NonNull IncomingMessageProcessor getIncomingMessageProcessor() {
assertInitialization();
2019-08-06 20:54:44 +02:00
if (incomingMessageProcessor == null) {
incomingMessageProcessor = provider.provideIncomingMessageProcessor();
}
return incomingMessageProcessor;
}
public static synchronized @NonNull BackgroundMessageRetriever getBackgroundMessageRetriever() {
assertInitialization();
2019-08-06 20:54:44 +02:00
if (backgroundMessageRetriever == null) {
backgroundMessageRetriever = provider.provideBackgroundMessageRetriever();
2019-08-06 20:54:44 +02:00
}
return backgroundMessageRetriever;
}
public static synchronized @NonNull LiveRecipientCache getRecipientCache() {
assertInitialization();
if (recipientCache == null) {
recipientCache = provider.provideRecipientCache();
}
return recipientCache;
}
public static synchronized @NonNull JobManager getJobManager() {
assertInitialization();
if (jobManager == null) {
jobManager = provider.provideJobManager();
}
return jobManager;
}
public static synchronized @NonNull FrameRateTracker getFrameRateTracker() {
assertInitialization();
if (frameRateTracker == null) {
frameRateTracker = provider.provideFrameRateTracker();
}
return frameRateTracker;
}
public static synchronized @NonNull KeyValueStore getKeyValueStore() {
assertInitialization();
if (keyValueStore == null) {
keyValueStore = provider.provideKeyValueStore();
}
return keyValueStore;
}
public static synchronized @NonNull MegaphoneRepository getMegaphoneRepository() {
assertInitialization();
if (megaphoneRepository == null) {
megaphoneRepository = provider.provideMegaphoneRepository();
}
return megaphoneRepository;
}
public static synchronized @NonNull EarlyMessageCache getEarlyMessageCache() {
assertInitialization();
if (earlyMessageCache == null) {
earlyMessageCache = provider.provideEarlyMessageCache();
}
return earlyMessageCache;
}
public static synchronized @NonNull MessageNotifier getMessageNotifier() {
assertInitialization();
return messageNotifier;
}
public static synchronized @NonNull IncomingMessageObserver getIncomingMessageObserver() {
2020-05-27 21:04:45 +02:00
assertInitialization();
if (incomingMessageObserver == null) {
incomingMessageObserver = provider.provideIncomingMessageObserver();
}
return incomingMessageObserver;
2020-05-27 21:04:45 +02:00
}
2020-09-03 23:52:44 +02:00
public static synchronized @NonNull TrimThreadsByDateManager getTrimThreadsByDateManager() {
assertInitialization();
return trimThreadsByDateManager;
}
private static void assertInitialization() {
2019-08-06 20:54:44 +02:00
if (application == null || provider == null) {
throw new UninitializedException();
}
}
public interface Provider {
2020-04-01 19:33:23 +02:00
@NonNull GroupsV2Operations provideGroupsV2Operations();
2019-08-06 20:54:44 +02:00
@NonNull SignalServiceAccountManager provideSignalServiceAccountManager();
@NonNull SignalServiceMessageSender provideSignalServiceMessageSender();
@NonNull SignalServiceMessageReceiver provideSignalServiceMessageReceiver();
@NonNull SignalServiceNetworkAccess provideSignalServiceNetworkAccess();
@NonNull IncomingMessageProcessor provideIncomingMessageProcessor();
@NonNull BackgroundMessageRetriever provideBackgroundMessageRetriever();
@NonNull LiveRecipientCache provideRecipientCache();
@NonNull JobManager provideJobManager();
@NonNull FrameRateTracker provideFrameRateTracker();
@NonNull KeyValueStore provideKeyValueStore();
@NonNull MegaphoneRepository provideMegaphoneRepository();
@NonNull EarlyMessageCache provideEarlyMessageCache();
2020-05-27 21:04:45 +02:00
@NonNull MessageNotifier provideMessageNotifier();
@NonNull IncomingMessageObserver provideIncomingMessageObserver();
2020-09-03 23:52:44 +02:00
@NonNull TrimThreadsByDateManager provideTrimThreadsByDateManager();
}
private static class UninitializedException extends IllegalStateException {
private UninitializedException() {
super("You must call init() first!");
}
}
}