2014-07-25 22:14:29 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2013 Open Whisper Systems
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
package org.thoughtcrime.securesms;
|
|
|
|
|
2017-12-22 00:37:07 +00:00
|
|
|
import android.annotation.SuppressLint;
|
2018-07-07 00:28:58 +00:00
|
|
|
import android.arch.lifecycle.DefaultLifecycleObserver;
|
|
|
|
import android.arch.lifecycle.LifecycleOwner;
|
|
|
|
import android.arch.lifecycle.ProcessLifecycleOwner;
|
2014-07-25 22:14:29 +00:00
|
|
|
import android.content.Context;
|
2017-01-11 23:37:51 +00:00
|
|
|
import android.os.AsyncTask;
|
2017-02-14 06:55:06 +00:00
|
|
|
import android.os.Build;
|
2018-07-07 00:28:58 +00:00
|
|
|
import android.support.annotation.NonNull;
|
2017-01-08 17:43:43 +00:00
|
|
|
import android.support.multidex.MultiDexApplication;
|
2017-01-11 23:37:51 +00:00
|
|
|
|
|
|
|
import com.google.android.gms.security.ProviderInstaller;
|
2015-05-21 19:30:18 +00:00
|
|
|
|
2019-05-01 16:00:26 +00:00
|
|
|
import org.conscrypt.Conscrypt;
|
2019-06-07 05:21:25 +00:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2019-05-01 16:00:26 +00:00
|
|
|
import org.signal.aesgcmprovider.AesGcmProvider;
|
2018-10-29 22:14:31 +00:00
|
|
|
import org.thoughtcrime.securesms.components.TypingStatusRepository;
|
|
|
|
import org.thoughtcrime.securesms.components.TypingStatusSender;
|
2019-04-03 20:30:29 +00:00
|
|
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
2014-11-12 03:57:53 +00:00
|
|
|
import org.thoughtcrime.securesms.dependencies.AxolotlStorageModule;
|
|
|
|
import org.thoughtcrime.securesms.dependencies.InjectableType;
|
2016-12-20 17:55:52 +00:00
|
|
|
import org.thoughtcrime.securesms.dependencies.SignalCommunicationModule;
|
2019-08-19 00:37:17 +00:00
|
|
|
import org.thoughtcrime.securesms.groups.GroupManager;
|
2019-03-28 15:56:35 +00:00
|
|
|
import org.thoughtcrime.securesms.jobmanager.DependencyInjector;
|
2018-06-18 19:27:04 +00:00
|
|
|
import org.thoughtcrime.securesms.jobmanager.JobManager;
|
2019-03-28 15:56:35 +00:00
|
|
|
import org.thoughtcrime.securesms.jobmanager.impl.JsonDataSerializer;
|
2016-03-12 01:07:22 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.CreateSignedPreKeyJob;
|
2019-06-18 03:23:58 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.FastJobStorage;
|
2019-01-24 11:04:28 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.FcmRefreshJob;
|
2019-06-18 03:23:58 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.JobManagerFactories;
|
2018-07-07 00:28:58 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.MultiDeviceContactUpdateJob;
|
2019-07-01 06:49:42 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.PushContentReceiveJob;
|
2018-10-05 22:23:33 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob;
|
2018-10-11 23:45:22 +00:00
|
|
|
import org.thoughtcrime.securesms.jobs.RefreshUnidentifiedDeliveryAbilityJob;
|
2018-07-26 14:10:46 +00:00
|
|
|
import org.thoughtcrime.securesms.logging.AndroidLogger;
|
|
|
|
import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger;
|
2018-08-01 15:09:24 +00:00
|
|
|
import org.thoughtcrime.securesms.logging.Log;
|
2018-07-26 14:10:46 +00:00
|
|
|
import org.thoughtcrime.securesms.logging.PersistentLogger;
|
|
|
|
import org.thoughtcrime.securesms.logging.UncaughtExceptionLogger;
|
2019-07-22 00:50:35 +00:00
|
|
|
import org.thoughtcrime.securesms.loki.BackgroundPollWorker;
|
2019-06-18 02:49:21 +00:00
|
|
|
import org.thoughtcrime.securesms.loki.LokiAPIDatabase;
|
2019-08-06 06:18:24 +00:00
|
|
|
import org.thoughtcrime.securesms.loki.LokiGroupChatPoller;
|
2019-04-17 14:21:30 +00:00
|
|
|
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
2018-08-06 16:20:24 +00:00
|
|
|
import org.thoughtcrime.securesms.notifications.NotificationChannels;
|
2019-02-26 01:47:30 +00:00
|
|
|
import org.thoughtcrime.securesms.providers.BlobProvider;
|
2016-12-30 04:54:05 +00:00
|
|
|
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
|
2017-01-06 17:19:58 +00:00
|
|
|
import org.thoughtcrime.securesms.service.DirectoryRefreshListener;
|
2016-08-16 03:23:56 +00:00
|
|
|
import org.thoughtcrime.securesms.service.ExpiringMessageManager;
|
2018-10-15 20:27:21 +00:00
|
|
|
import org.thoughtcrime.securesms.service.IncomingMessageObserver;
|
|
|
|
import org.thoughtcrime.securesms.service.KeyCachingService;
|
2018-02-26 17:58:18 +00:00
|
|
|
import org.thoughtcrime.securesms.service.LocalBackupListener;
|
2018-05-22 09:13:10 +00:00
|
|
|
import org.thoughtcrime.securesms.service.RotateSenderCertificateListener;
|
2017-01-06 17:19:58 +00:00
|
|
|
import org.thoughtcrime.securesms.service.RotateSignedPreKeyListener;
|
2017-02-26 22:36:43 +00:00
|
|
|
import org.thoughtcrime.securesms.service.UpdateApkRefreshListener;
|
2014-07-25 22:14:29 +00:00
|
|
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
2019-03-25 20:23:38 +00:00
|
|
|
import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper;
|
2016-11-09 17:37:40 +00:00
|
|
|
import org.webrtc.PeerConnectionFactory;
|
2017-12-22 00:37:07 +00:00
|
|
|
import org.webrtc.PeerConnectionFactory.InitializationOptions;
|
2017-03-21 17:23:16 +00:00
|
|
|
import org.webrtc.voiceengine.WebRtcAudioManager;
|
|
|
|
import org.webrtc.voiceengine.WebRtcAudioUtils;
|
2016-03-23 17:34:41 +00:00
|
|
|
import org.whispersystems.libsignal.logging.SignalProtocolLoggerProvider;
|
2019-06-25 03:51:24 +00:00
|
|
|
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
|
|
|
|
import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
|
2019-08-19 00:37:17 +00:00
|
|
|
import org.whispersystems.signalservice.loki.api.LokiGroupChatAPI;
|
2019-06-18 02:49:21 +00:00
|
|
|
import org.whispersystems.signalservice.loki.api.LokiLongPoller;
|
2019-06-07 05:21:25 +00:00
|
|
|
import org.whispersystems.signalservice.loki.api.LokiP2PAPI;
|
|
|
|
import org.whispersystems.signalservice.loki.api.LokiP2PAPIDelegate;
|
2014-07-25 22:14:29 +00:00
|
|
|
|
2019-05-01 16:00:26 +00:00
|
|
|
import java.security.Security;
|
2017-03-21 17:23:16 +00:00
|
|
|
import java.util.HashSet;
|
2019-06-25 03:51:24 +00:00
|
|
|
import java.util.List;
|
2017-03-21 17:23:16 +00:00
|
|
|
import java.util.Set;
|
2017-03-17 17:28:06 +00:00
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
2014-11-12 03:57:53 +00:00
|
|
|
import dagger.ObjectGraph;
|
2019-06-25 03:51:24 +00:00
|
|
|
import kotlin.Unit;
|
|
|
|
import kotlin.jvm.functions.Function1;
|
2019-07-24 02:30:23 +00:00
|
|
|
import network.loki.messenger.BuildConfig;
|
2014-11-12 03:57:53 +00:00
|
|
|
|
2014-07-25 22:14:29 +00:00
|
|
|
/**
|
|
|
|
* Will be called once when the TextSecure process is created.
|
|
|
|
*
|
|
|
|
* We're using this as an insertion point to patch up the Android PRNG disaster,
|
|
|
|
* to initialize the job manager, and to check for GCM registration freshness.
|
|
|
|
*
|
|
|
|
* @author Moxie Marlinspike
|
|
|
|
*/
|
2019-06-07 05:21:25 +00:00
|
|
|
public class ApplicationContext extends MultiDexApplication implements DependencyInjector, DefaultLifecycleObserver, LokiP2PAPIDelegate {
|
2014-07-25 22:14:29 +00:00
|
|
|
|
2018-07-26 14:10:46 +00:00
|
|
|
private static final String TAG = ApplicationContext.class.getSimpleName();
|
2017-01-11 23:37:51 +00:00
|
|
|
|
2018-10-15 20:27:21 +00:00
|
|
|
private ExpiringMessageManager expiringMessageManager;
|
2018-10-29 22:14:31 +00:00
|
|
|
private TypingStatusRepository typingStatusRepository;
|
|
|
|
private TypingStatusSender typingStatusSender;
|
2019-04-17 14:21:30 +00:00
|
|
|
private JobManager jobManager;
|
2018-10-15 20:27:21 +00:00
|
|
|
private IncomingMessageObserver incomingMessageObserver;
|
|
|
|
private ObjectGraph objectGraph;
|
|
|
|
private PersistentLogger persistentLogger;
|
2019-06-28 06:08:27 +00:00
|
|
|
|
|
|
|
// Loki
|
|
|
|
private LokiLongPoller lokiLongPoller = null;
|
2019-08-06 06:18:24 +00:00
|
|
|
private LokiGroupChatPoller lokiGroupChatPoller = null;
|
2019-06-28 06:08:27 +00:00
|
|
|
public SignalCommunicationModule communicationModule;
|
2019-06-18 02:49:21 +00:00
|
|
|
|
2018-07-07 00:28:58 +00:00
|
|
|
private volatile boolean isAppVisible;
|
|
|
|
|
2014-07-25 22:14:29 +00:00
|
|
|
public static ApplicationContext getInstance(Context context) {
|
|
|
|
return (ApplicationContext)context.getApplicationContext();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCreate() {
|
2018-10-04 16:09:04 +00:00
|
|
|
super.onCreate();
|
2018-10-05 22:23:33 +00:00
|
|
|
Log.i(TAG, "onCreate()");
|
2019-05-01 16:00:26 +00:00
|
|
|
initializeSecurityProvider();
|
2018-10-04 16:09:04 +00:00
|
|
|
initializeLogging();
|
|
|
|
initializeCrashHandling();
|
|
|
|
initializeDependencyInjection();
|
|
|
|
initializeJobManager();
|
2018-10-15 20:27:21 +00:00
|
|
|
initializeMessageRetrieval();
|
2018-10-04 16:09:04 +00:00
|
|
|
initializeExpiringMessageManager();
|
2018-10-29 22:14:31 +00:00
|
|
|
initializeTypingStatusRepository();
|
|
|
|
initializeTypingStatusSender();
|
2018-10-04 16:09:04 +00:00
|
|
|
initializeGcmCheck();
|
|
|
|
initializeSignedPreKeyCheck();
|
|
|
|
initializePeriodicTasks();
|
|
|
|
initializeCircumvention();
|
|
|
|
initializeWebRtc();
|
2018-10-05 22:23:33 +00:00
|
|
|
initializePendingMessages();
|
2018-10-11 23:45:22 +00:00
|
|
|
initializeUnidentifiedDeliveryAbilityRefresh();
|
2019-02-26 01:47:30 +00:00
|
|
|
initializeBlobProvider();
|
2018-10-04 16:09:04 +00:00
|
|
|
NotificationChannels.create(this);
|
|
|
|
ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
|
2019-06-18 03:23:58 +00:00
|
|
|
// Loki - Set up P2P API if needed
|
|
|
|
setUpP2PAPI();
|
2018-07-07 00:28:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onStart(@NonNull LifecycleOwner owner) {
|
|
|
|
isAppVisible = true;
|
|
|
|
Log.i(TAG, "App is now visible.");
|
|
|
|
executePendingContactSync();
|
2018-10-15 20:27:21 +00:00
|
|
|
KeyCachingService.onAppForegrounded(this);
|
2019-06-18 03:23:58 +00:00
|
|
|
// Loki - Start long polling if needed
|
2019-07-22 00:50:35 +00:00
|
|
|
startLongPollingIfNeeded();
|
2018-07-07 00:28:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onStop(@NonNull LifecycleOwner owner) {
|
|
|
|
isAppVisible = false;
|
|
|
|
Log.i(TAG, "App is no longer visible.");
|
2018-10-15 20:27:21 +00:00
|
|
|
KeyCachingService.onAppBackgrounded(this);
|
2019-04-17 14:21:30 +00:00
|
|
|
MessageNotifier.setVisibleThread(-1);
|
2019-06-18 03:23:58 +00:00
|
|
|
// Loki - Stop long polling if needed
|
2019-06-19 04:47:42 +00:00
|
|
|
if (lokiLongPoller != null) { lokiLongPoller.stopIfNeeded(); }
|
2014-07-25 22:14:29 +00:00
|
|
|
}
|
|
|
|
|
2014-11-12 03:57:53 +00:00
|
|
|
@Override
|
|
|
|
public void injectDependencies(Object object) {
|
|
|
|
if (object instanceof InjectableType) {
|
|
|
|
objectGraph.inject(object);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-25 22:14:29 +00:00
|
|
|
public JobManager getJobManager() {
|
|
|
|
return jobManager;
|
|
|
|
}
|
|
|
|
|
2016-08-16 03:23:56 +00:00
|
|
|
public ExpiringMessageManager getExpiringMessageManager() {
|
|
|
|
return expiringMessageManager;
|
|
|
|
}
|
|
|
|
|
2018-10-29 22:14:31 +00:00
|
|
|
public TypingStatusRepository getTypingStatusRepository() {
|
|
|
|
return typingStatusRepository;
|
|
|
|
}
|
|
|
|
|
|
|
|
public TypingStatusSender getTypingStatusSender() {
|
|
|
|
return typingStatusSender;
|
|
|
|
}
|
|
|
|
|
2018-07-07 00:28:58 +00:00
|
|
|
public boolean isAppVisible() {
|
|
|
|
return isAppVisible;
|
|
|
|
}
|
|
|
|
|
2018-07-26 14:10:46 +00:00
|
|
|
public PersistentLogger getPersistentLogger() {
|
|
|
|
return persistentLogger;
|
|
|
|
}
|
|
|
|
|
2019-05-01 16:00:26 +00:00
|
|
|
private void initializeSecurityProvider() {
|
|
|
|
try {
|
|
|
|
Class.forName("org.signal.aesgcmprovider.AesGcmCipher");
|
|
|
|
} catch (ClassNotFoundException e) {
|
|
|
|
Log.e(TAG, "Failed to find AesGcmCipher class");
|
|
|
|
throw new ProviderInitializationException();
|
|
|
|
}
|
|
|
|
|
|
|
|
int aesPosition = Security.insertProviderAt(new AesGcmProvider(), 1);
|
|
|
|
Log.i(TAG, "Installed AesGcmProvider: " + aesPosition);
|
|
|
|
|
|
|
|
if (aesPosition < 0) {
|
|
|
|
Log.e(TAG, "Failed to install AesGcmProvider()");
|
|
|
|
throw new ProviderInitializationException();
|
|
|
|
}
|
|
|
|
|
|
|
|
int conscryptPosition = Security.insertProviderAt(Conscrypt.newProvider(), 2);
|
|
|
|
Log.i(TAG, "Installed Conscrypt provider: " + conscryptPosition);
|
|
|
|
|
|
|
|
if (conscryptPosition < 0) {
|
|
|
|
Log.w(TAG, "Did not install Conscrypt provider. May already be present.");
|
|
|
|
}
|
2014-07-25 22:14:29 +00:00
|
|
|
}
|
|
|
|
|
2015-03-02 16:25:19 +00:00
|
|
|
private void initializeLogging() {
|
2018-07-26 14:10:46 +00:00
|
|
|
persistentLogger = new PersistentLogger(this);
|
|
|
|
org.thoughtcrime.securesms.logging.Log.initialize(new AndroidLogger(), persistentLogger);
|
|
|
|
|
|
|
|
SignalProtocolLoggerProvider.setProvider(new CustomSignalProtocolLogger());
|
|
|
|
}
|
|
|
|
|
|
|
|
private void initializeCrashHandling() {
|
|
|
|
final Thread.UncaughtExceptionHandler originalHandler = Thread.getDefaultUncaughtExceptionHandler();
|
2019-04-10 16:53:55 +00:00
|
|
|
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionLogger(originalHandler));
|
2015-03-02 16:25:19 +00:00
|
|
|
}
|
|
|
|
|
2014-07-25 22:14:29 +00:00
|
|
|
private void initializeJobManager() {
|
2019-03-28 15:56:35 +00:00
|
|
|
this.jobManager = new JobManager(this, new JobManager.Configuration.Builder()
|
|
|
|
.setDataSerializer(new JsonDataSerializer())
|
|
|
|
.setJobFactories(JobManagerFactories.getJobFactories(this))
|
|
|
|
.setConstraintFactories(JobManagerFactories.getConstraintFactories(this))
|
|
|
|
.setConstraintObservers(JobManagerFactories.getConstraintObservers(this))
|
|
|
|
.setJobStorage(new FastJobStorage(DatabaseFactory.getJobDatabase(this)))
|
|
|
|
.setDependencyInjector(this)
|
|
|
|
.build());
|
2014-07-25 22:14:29 +00:00
|
|
|
}
|
|
|
|
|
2018-10-15 20:27:21 +00:00
|
|
|
public void initializeMessageRetrieval() {
|
|
|
|
this.incomingMessageObserver = new IncomingMessageObserver(this);
|
|
|
|
}
|
|
|
|
|
2014-11-12 03:57:53 +00:00
|
|
|
private void initializeDependencyInjection() {
|
2019-06-28 06:08:27 +00:00
|
|
|
communicationModule = new SignalCommunicationModule(this, new SignalServiceNetworkAccess(this));
|
|
|
|
this.objectGraph = ObjectGraph.create(communicationModule, new AxolotlStorageModule(this));
|
2014-11-12 03:57:53 +00:00
|
|
|
}
|
|
|
|
|
2014-07-25 22:14:29 +00:00
|
|
|
private void initializeGcmCheck() {
|
2017-03-06 19:50:51 +00:00
|
|
|
if (TextSecurePreferences.isPushRegistered(this)) {
|
2019-01-24 11:04:28 +00:00
|
|
|
long nextSetTime = TextSecurePreferences.getFcmTokenLastSetTime(this) + TimeUnit.HOURS.toMillis(6);
|
2017-03-17 17:28:06 +00:00
|
|
|
|
2019-01-24 11:04:28 +00:00
|
|
|
if (TextSecurePreferences.getFcmToken(this) == null || nextSetTime <= System.currentTimeMillis()) {
|
2019-03-28 15:56:35 +00:00
|
|
|
this.jobManager.add(new FcmRefreshJob());
|
2017-03-17 17:28:06 +00:00
|
|
|
}
|
2014-07-25 22:14:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-12 01:07:22 +00:00
|
|
|
private void initializeSignedPreKeyCheck() {
|
|
|
|
if (!TextSecurePreferences.isSignedPreKeyRegistered(this)) {
|
|
|
|
jobManager.add(new CreateSignedPreKeyJob(this));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-16 03:23:56 +00:00
|
|
|
private void initializeExpiringMessageManager() {
|
|
|
|
this.expiringMessageManager = new ExpiringMessageManager(this);
|
|
|
|
}
|
|
|
|
|
2018-10-29 22:14:31 +00:00
|
|
|
private void initializeTypingStatusRepository() {
|
|
|
|
this.typingStatusRepository = new TypingStatusRepository();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void initializeTypingStatusSender() {
|
|
|
|
this.typingStatusSender = new TypingStatusSender(this);
|
|
|
|
}
|
|
|
|
|
2017-01-06 17:19:58 +00:00
|
|
|
private void initializePeriodicTasks() {
|
|
|
|
RotateSignedPreKeyListener.schedule(this);
|
|
|
|
DirectoryRefreshListener.schedule(this);
|
2018-02-26 17:58:18 +00:00
|
|
|
LocalBackupListener.schedule(this);
|
2018-05-22 09:13:10 +00:00
|
|
|
RotateSenderCertificateListener.schedule(this);
|
2019-07-22 00:50:35 +00:00
|
|
|
BackgroundPollWorker.schedule(this); // Loki
|
2017-02-26 22:36:43 +00:00
|
|
|
|
|
|
|
if (BuildConfig.PLAY_STORE_DISABLED) {
|
|
|
|
UpdateApkRefreshListener.schedule(this);
|
|
|
|
}
|
2017-01-06 17:19:58 +00:00
|
|
|
}
|
|
|
|
|
2017-03-21 17:23:16 +00:00
|
|
|
private void initializeWebRtc() {
|
2017-07-21 23:29:03 +00:00
|
|
|
try {
|
|
|
|
Set<String> HARDWARE_AEC_BLACKLIST = new HashSet<String>() {{
|
|
|
|
add("Pixel");
|
|
|
|
add("Pixel XL");
|
|
|
|
add("Moto G5");
|
2018-04-19 17:58:39 +00:00
|
|
|
add("Moto G (5S) Plus");
|
2018-06-05 16:09:20 +00:00
|
|
|
add("Moto G4");
|
|
|
|
add("TA-1053");
|
2018-06-29 10:07:58 +00:00
|
|
|
add("Mi A1");
|
2018-07-03 11:16:01 +00:00
|
|
|
add("E5823"); // Sony z5 compact
|
2019-02-14 05:07:34 +00:00
|
|
|
add("Redmi Note 5");
|
2018-12-11 21:23:01 +00:00
|
|
|
add("FP2"); // Fairphone FP2
|
2019-03-10 13:29:02 +00:00
|
|
|
add("MI 5");
|
2017-07-21 23:29:03 +00:00
|
|
|
}};
|
|
|
|
|
|
|
|
Set<String> OPEN_SL_ES_WHITELIST = new HashSet<String>() {{
|
|
|
|
add("Pixel");
|
|
|
|
add("Pixel XL");
|
|
|
|
}};
|
|
|
|
|
2017-12-22 00:37:07 +00:00
|
|
|
if (HARDWARE_AEC_BLACKLIST.contains(Build.MODEL)) {
|
|
|
|
WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
|
|
|
|
}
|
2017-03-21 17:23:16 +00:00
|
|
|
|
2017-12-22 00:37:07 +00:00
|
|
|
if (!OPEN_SL_ES_WHITELIST.contains(Build.MODEL)) {
|
|
|
|
WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true);
|
2017-07-21 23:29:03 +00:00
|
|
|
}
|
2017-12-22 00:37:07 +00:00
|
|
|
|
2019-01-29 22:25:49 +00:00
|
|
|
PeerConnectionFactory.initialize(InitializationOptions.builder(this).createInitializationOptions());
|
2017-07-21 23:29:03 +00:00
|
|
|
} catch (UnsatisfiedLinkError e) {
|
|
|
|
Log.w(TAG, e);
|
2017-03-21 17:23:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-22 00:37:07 +00:00
|
|
|
@SuppressLint("StaticFieldLeak")
|
2017-01-11 23:37:51 +00:00
|
|
|
private void initializeCircumvention() {
|
2017-03-21 17:23:16 +00:00
|
|
|
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
|
2017-01-11 23:37:51 +00:00
|
|
|
@Override
|
|
|
|
protected Void doInBackground(Void... params) {
|
|
|
|
if (new SignalServiceNetworkAccess(ApplicationContext.this).isCensored(ApplicationContext.this)) {
|
|
|
|
try {
|
|
|
|
ProviderInstaller.installIfNeeded(ApplicationContext.this);
|
|
|
|
} catch (Throwable t) {
|
|
|
|
Log.w(TAG, t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2017-03-21 17:23:16 +00:00
|
|
|
};
|
|
|
|
|
2017-10-23 20:03:32 +00:00
|
|
|
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
2017-01-11 23:37:51 +00:00
|
|
|
}
|
|
|
|
|
2018-07-07 00:28:58 +00:00
|
|
|
private void executePendingContactSync() {
|
|
|
|
if (TextSecurePreferences.needsFullContactSync(this)) {
|
|
|
|
ApplicationContext.getInstance(this).getJobManager().add(new MultiDeviceContactUpdateJob(this, true));
|
|
|
|
}
|
|
|
|
}
|
2018-10-05 22:23:33 +00:00
|
|
|
|
|
|
|
private void initializePendingMessages() {
|
|
|
|
if (TextSecurePreferences.getNeedsMessagePull(this)) {
|
|
|
|
Log.i(TAG, "Scheduling a message fetch.");
|
2018-10-10 16:00:14 +00:00
|
|
|
ApplicationContext.getInstance(this).getJobManager().add(new PushNotificationReceiveJob(this));
|
2018-10-05 22:23:33 +00:00
|
|
|
TextSecurePreferences.setNeedsMessagePull(this, false);
|
|
|
|
}
|
|
|
|
}
|
2018-10-11 23:45:22 +00:00
|
|
|
|
|
|
|
private void initializeUnidentifiedDeliveryAbilityRefresh() {
|
|
|
|
if (TextSecurePreferences.isMultiDevice(this) && !TextSecurePreferences.isUnidentifiedDeliveryEnabled(this)) {
|
2019-03-28 15:56:35 +00:00
|
|
|
jobManager.add(new RefreshUnidentifiedDeliveryAbilityJob());
|
2018-10-11 23:45:22 +00:00
|
|
|
}
|
|
|
|
}
|
2019-02-26 01:47:30 +00:00
|
|
|
|
|
|
|
private void initializeBlobProvider() {
|
|
|
|
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
|
|
|
|
BlobProvider.getInstance().onSessionStart(this);
|
|
|
|
});
|
|
|
|
}
|
2019-03-25 20:23:38 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void attachBaseContext(Context base) {
|
|
|
|
super.attachBaseContext(DynamicLanguageContextWrapper.updateContext(base, TextSecurePreferences.getLanguage(base)));
|
|
|
|
}
|
2019-05-01 16:00:26 +00:00
|
|
|
|
|
|
|
private static class ProviderInitializationException extends RuntimeException {
|
|
|
|
}
|
2019-06-07 05:21:25 +00:00
|
|
|
|
2019-06-18 03:23:58 +00:00
|
|
|
// region Loki
|
|
|
|
public void setUpP2PAPI() {
|
|
|
|
String hexEncodedPublicKey = TextSecurePreferences.getLocalNumber(this);
|
|
|
|
if (hexEncodedPublicKey == null) { return; }
|
|
|
|
LokiP2PAPI.Companion.configure(hexEncodedPublicKey, (isOnline, contactPublicKey) -> {
|
|
|
|
// TODO: Implement
|
|
|
|
return null;
|
|
|
|
}, this);
|
|
|
|
}
|
|
|
|
|
2019-06-07 05:21:25 +00:00
|
|
|
@Override
|
|
|
|
public void ping(@NotNull String s) {
|
|
|
|
// TODO: Implement
|
|
|
|
}
|
2019-06-18 03:23:58 +00:00
|
|
|
|
|
|
|
private void setUpLongPollingIfNeeded() {
|
|
|
|
if (lokiLongPoller != null) return;
|
2019-07-22 00:50:35 +00:00
|
|
|
String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(this);
|
|
|
|
if (userHexEncodedPublicKey == null) return;
|
2019-08-09 02:00:01 +00:00
|
|
|
LokiAPIDatabase lokiAPIDatabase = DatabaseFactory.getLokiAPIDatabase(this);
|
2019-06-25 03:51:24 +00:00
|
|
|
Context context = this;
|
2019-08-09 02:00:01 +00:00
|
|
|
lokiLongPoller = new LokiLongPoller(userHexEncodedPublicKey, lokiAPIDatabase, new Function1<List<SignalServiceProtos.Envelope>, Unit>() {
|
2019-06-25 03:51:24 +00:00
|
|
|
|
|
|
|
@Override
|
2019-07-22 00:50:35 +00:00
|
|
|
public Unit invoke(List<SignalServiceProtos.Envelope> protos) {
|
|
|
|
for (SignalServiceProtos.Envelope proto : protos) {
|
|
|
|
new PushContentReceiveJob(context).processEnvelope(new SignalServiceEnvelope(proto));
|
2019-06-25 03:51:24 +00:00
|
|
|
}
|
|
|
|
return Unit.INSTANCE;
|
|
|
|
}
|
|
|
|
});
|
2019-06-18 03:23:58 +00:00
|
|
|
}
|
2019-08-05 02:08:23 +00:00
|
|
|
|
|
|
|
public void startLongPollingIfNeeded() {
|
|
|
|
setUpLongPollingIfNeeded();
|
|
|
|
if (lokiLongPoller != null) { lokiLongPoller.startIfNeeded(); }
|
|
|
|
}
|
|
|
|
|
2019-08-06 06:18:24 +00:00
|
|
|
private void setUpPublicChatIfNeeded() {
|
|
|
|
if (lokiGroupChatPoller != null) return;
|
|
|
|
lokiGroupChatPoller = new LokiGroupChatPoller(this, LokiGroupChatAPI.getPublicChatID());
|
2019-08-05 02:08:23 +00:00
|
|
|
boolean isPublicChatSetUp = TextSecurePreferences.isPublicChatSetUp(this);
|
|
|
|
if (isPublicChatSetUp) return;
|
2019-08-09 02:00:01 +00:00
|
|
|
String id = LokiGroupChatAPI.getServerURL() + "." + LokiGroupChatAPI.getPublicChatID();
|
2019-08-05 06:27:37 +00:00
|
|
|
GroupManager.createGroup(id, this, new HashSet<>(), null, "Loki Public Chat", false);
|
2019-08-05 02:08:23 +00:00
|
|
|
TextSecurePreferences.markPublicChatSetUp(this);
|
|
|
|
}
|
2019-08-06 06:18:24 +00:00
|
|
|
|
|
|
|
public void startPublicChatPollingIfNeeded() {
|
|
|
|
setUpPublicChatIfNeeded();
|
|
|
|
lokiGroupChatPoller.startIfNeeded();
|
|
|
|
}
|
2019-06-18 03:23:58 +00:00
|
|
|
// endregion
|
2014-07-25 22:14:29 +00:00
|
|
|
}
|