diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 695e0e5f5e..81126b7e82 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -319,7 +319,7 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
index b832b707f7..aae842422b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
@@ -27,6 +27,8 @@ import androidx.multidex.MultiDexApplication;
import com.google.android.gms.security.ProviderInstaller;
+import net.sqlcipher.database.SQLiteDatabase;
+
import org.conscrypt.Conscrypt;
import org.signal.aesgcmprovider.AesGcmProvider;
import org.signal.core.util.concurrent.SignalExecutors;
@@ -126,11 +128,11 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
Log.i(TAG, "onCreate()");
})
.addBlocking("crash-handling", this::initializeCrashHandling)
+ .addBlocking("sqlcipher-init", () -> SQLiteDatabase.loadLibs(this))
.addBlocking("rx-init", () -> {
RxJavaPlugins.setInitIoSchedulerHandler(schedulerSupplier -> Schedulers.from(SignalExecutors.BOUNDED_IO, true, false));
RxJavaPlugins.setInitComputationSchedulerHandler(schedulerSupplier -> Schedulers.from(SignalExecutors.BOUNDED, true, false));
})
- .addBlocking("eat-db", () -> DatabaseFactory.getInstance(this))
.addBlocking("app-dependencies", this::initializeAppDependencies)
.addBlocking("notification-channels", () -> NotificationChannels.create(this))
.addBlocking("first-launch", this::initializeFirstEverAppLaunch)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java
index 8e08e377f4..e68f1689f2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseFactory.java
@@ -227,8 +227,6 @@ public class DatabaseFactory {
}
private DatabaseFactory(@NonNull Context context) {
- SQLiteDatabase.loadLibs(context);
-
DatabaseSecret databaseSecret = DatabaseSecretProvider.getOrCreateDatabaseSecret(context);
AttachmentSecret attachmentSecret = AttachmentSecretProvider.getInstance(context).getOrCreateAttachmentSecret();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java
index 3e62c0b17d..6c5087ec6e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.java
@@ -11,6 +11,7 @@ import com.annimon.stream.Stream;
import net.sqlcipher.database.SQLiteOpenHelper;
import net.sqlcipher.database.SQLiteDatabase;
+import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider;
@@ -140,9 +141,11 @@ public class JobDatabase extends SQLiteOpenHelper implements SignalDatabase {
public void onOpen(SQLiteDatabase db) {
Log.i(TAG, "onOpen()");
- dropTableIfPresent("job_spec");
- dropTableIfPresent("constraint_spec");
- dropTableIfPresent("dependency_spec");
+ SignalExecutors.BOUNDED.execute(() -> {
+ dropTableIfPresent("job_spec");
+ dropTableIfPresent("constraint_spec");
+ dropTableIfPresent("dependency_spec");
+ });
}
public synchronized void insertJobs(@NonNull List fullSpecs) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java
index 9039a4ccba..f3a4939229 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/KeyValueDatabase.java
@@ -10,6 +10,7 @@ import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabaseHook;
import net.sqlcipher.database.SQLiteOpenHelper;
+import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider;
@@ -88,10 +89,12 @@ public class KeyValueDatabase extends SQLiteOpenHelper implements SignalDatabase
public void onOpen(SQLiteDatabase db) {
Log.i(TAG, "onOpen()");
- if (DatabaseFactory.getInstance(application).hasTable("key_value")) {
- Log.i(TAG, "Dropping original key_value table from the main database.");
- DatabaseFactory.getInstance(application).getRawDatabase().rawExecSQL("DROP TABLE key_value");
- }
+ SignalExecutors.BOUNDED.execute(() -> {
+ if (DatabaseFactory.getInstance(application).hasTable("key_value")) {
+ Log.i(TAG, "Dropping original key_value table from the main database.");
+ DatabaseFactory.getInstance(application).getRawDatabase().rawExecSQL("DROP TABLE key_value");
+ }
+ });
}
public @NonNull KeyValueDataSet getDataSet() {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java
index 824e8532dd..d1c2757ea4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MegaphoneDatabase.java
@@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
+import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider;
@@ -91,10 +92,12 @@ public class MegaphoneDatabase extends SQLiteOpenHelper implements SignalDatabas
public void onOpen(SQLiteDatabase db) {
Log.i(TAG, "onOpen()");
- if (DatabaseFactory.getInstance(application).hasTable("megaphone")) {
- Log.i(TAG, "Dropping original megaphone table from the main database.");
- DatabaseFactory.getInstance(application).getRawDatabase().rawExecSQL("DROP TABLE megaphone");
- }
+ SignalExecutors.BOUNDED.execute(() -> {
+ if (DatabaseFactory.getInstance(application).hasTable("megaphone")) {
+ Log.i(TAG, "Dropping original megaphone table from the main database.");
+ DatabaseFactory.getInstance(application).getRawDatabase().rawExecSQL("DROP TABLE megaphone");
+ }
+ });
}
public void insert(@NonNull Collection events) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java
index 280dee7125..8b7477e468 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java
@@ -62,7 +62,6 @@ public class ApplicationDependencies {
private static Application application;
private static Provider provider;
- private static MessageNotifier messageNotifier;
private static AppForegroundObserver appForegroundObserver;
private static volatile SignalServiceAccountManager accountManager;
@@ -92,6 +91,7 @@ public class ApplicationDependencies {
private static volatile PendingRetryReceiptManager pendingRetryReceiptManager;
private static volatile PendingRetryReceiptCache pendingRetryReceiptCache;
private static volatile SignalWebSocket signalWebSocket;
+ private static volatile MessageNotifier messageNotifier;
@MainThread
public static void init(@NonNull Application application, @NonNull Provider provider) {
@@ -102,7 +102,6 @@ public class ApplicationDependencies {
ApplicationDependencies.application = application;
ApplicationDependencies.provider = provider;
- ApplicationDependencies.messageNotifier = provider.provideMessageNotifier();
ApplicationDependencies.appForegroundObserver = provider.provideAppForegroundObserver();
ApplicationDependencies.appForegroundObserver.begin();
@@ -322,6 +321,13 @@ public class ApplicationDependencies {
}
public static @NonNull MessageNotifier getMessageNotifier() {
+ if (messageNotifier == null) {
+ synchronized (LOCK) {
+ if (messageNotifier == null) {
+ messageNotifier = provider.provideMessageNotifier();
+ }
+ }
+ }
return messageNotifier;
}
diff --git a/app/src/main/res/layout/application_migration_activity.xml b/app/src/main/res/layout/application_migration_activity.xml
index 37e178a620..b3ebf5f2bc 100644
--- a/app/src/main/res/layout/application_migration_activity.xml
+++ b/app/src/main/res/layout/application_migration_activity.xml
@@ -1,46 +1,32 @@
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file