package org.thoughtcrime.securesms.dependencies; import android.app.Application; import android.content.Context; import androidx.annotation.NonNull; import org.greenrobot.eventbus.EventBus; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.IncomingMessageProcessor; import org.thoughtcrime.securesms.crypto.storage.SignalProtocolStoreImpl; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.events.ReminderUpdateEvent; import org.thoughtcrime.securesms.gcm.MessageRetriever; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.jobmanager.JobMigrator; import org.thoughtcrime.securesms.jobmanager.impl.JsonDataSerializer; import org.thoughtcrime.securesms.jobs.FastJobStorage; import org.thoughtcrime.securesms.jobs.JobManagerFactories; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.push.SecurityEventListener; import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess; import org.thoughtcrime.securesms.recipients.LiveRecipientCache; import org.thoughtcrime.securesms.service.IncomingMessageObserver; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.util.CredentialsProvider; import org.whispersystems.signalservice.api.util.RealtimeSleepTimer; import org.whispersystems.signalservice.api.util.SleepTimer; import org.whispersystems.signalservice.api.util.UptimeSleepTimer; import org.whispersystems.signalservice.api.websocket.ConnectivityListener; import java.util.UUID; /** * Implementation of {@link ApplicationDependencies.Provider} that provides real app dependencies. */ public class ApplicationDependencyProvider implements ApplicationDependencies.Provider { private static final String TAG = Log.tag(ApplicationDependencyProvider.class); private final Application context; private final SignalServiceNetworkAccess networkAccess; public ApplicationDependencyProvider(@NonNull Application context, @NonNull SignalServiceNetworkAccess networkAccess) { this.context = context; this.networkAccess = networkAccess; } @Override public @NonNull SignalServiceAccountManager provideSignalServiceAccountManager() { return new SignalServiceAccountManager(networkAccess.getConfiguration(context), new DynamicCredentialsProvider(context), BuildConfig.USER_AGENT); } @Override public @NonNull SignalServiceMessageSender provideSignalServiceMessageSender() { return new SignalServiceMessageSender(networkAccess.getConfiguration(context), new DynamicCredentialsProvider(context), new SignalProtocolStoreImpl(context), BuildConfig.USER_AGENT, TextSecurePreferences.isMultiDevice(context), Optional.fromNullable(IncomingMessageObserver.getPipe()), Optional.fromNullable(IncomingMessageObserver.getUnidentifiedPipe()), Optional.of(new SecurityEventListener(context))); } @Override public @NonNull SignalServiceMessageReceiver provideSignalServiceMessageReceiver() { SleepTimer sleepTimer = TextSecurePreferences.isFcmDisabled(context) ? new RealtimeSleepTimer(context) : new UptimeSleepTimer(); return new SignalServiceMessageReceiver(networkAccess.getConfiguration(context), new DynamicCredentialsProvider(context), BuildConfig.USER_AGENT, new PipeConnectivityListener(), sleepTimer); } @Override public @NonNull SignalServiceNetworkAccess provideSignalServiceNetworkAccess() { return networkAccess; } @Override public @NonNull IncomingMessageProcessor provideIncomingMessageProcessor() { return new IncomingMessageProcessor(context); } @Override public @NonNull MessageRetriever provideMessageRetriever() { return new MessageRetriever(); } @Override public @NonNull LiveRecipientCache provideRecipientCache() { return new LiveRecipientCache(context); } @Override public @NonNull JobManager provideJobManager() { return new JobManager(context, new JobManager.Configuration.Builder() .setDataSerializer(new JsonDataSerializer()) .setJobFactories(JobManagerFactories.getJobFactories(context)) .setConstraintFactories(JobManagerFactories.getConstraintFactories(context)) .setConstraintObservers(JobManagerFactories.getConstraintObservers(context)) .setJobStorage(new FastJobStorage(DatabaseFactory.getJobDatabase(context))) .setJobMigrator(new JobMigrator(TextSecurePreferences.getJobManagerVersion(context), JobManager.CURRENT_VERSION, JobManagerFactories.getJobMigrations(context))) .build()); } private static class DynamicCredentialsProvider implements CredentialsProvider { private final Context context; private DynamicCredentialsProvider(Context context) { this.context = context.getApplicationContext(); } @Override public UUID getUuid() { return TextSecurePreferences.getLocalUuid(context); } @Override public String getE164() { return TextSecurePreferences.getLocalNumber(context); } @Override public String getPassword() { return TextSecurePreferences.getPushServerPassword(context); } @Override public String getSignalingKey() { return TextSecurePreferences.getSignalingKey(context); } } private class PipeConnectivityListener implements ConnectivityListener { @Override public void onConnected() { Log.i(TAG, "onConnected()"); } @Override public void onConnecting() { Log.i(TAG, "onConnecting()"); } @Override public void onDisconnected() { Log.w(TAG, "onDisconnected()"); } @Override public void onAuthenticationFailure() { Log.w(TAG, "onAuthenticationFailure()"); TextSecurePreferences.setUnauthorizedReceived(context, true); EventBus.getDefault().post(new ReminderUpdateEvent()); } } }