diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java index 1fb4a873d..73d3fd7da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java @@ -4,12 +4,12 @@ import android.annotation.SuppressLint; import android.content.Context; import androidx.annotation.AnyThread; -import androidx.annotation.GuardedBy; import androidx.annotation.NonNull; +import net.sqlcipher.database.SQLiteDatabase; + import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.crypto.DatabaseSessionLock; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase.MissingRecipientException; @@ -17,13 +17,14 @@ import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.util.LRUCache; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.whispersystems.signalservice.api.SignalSessionLock; +import org.thoughtcrime.securesms.util.concurrent.FilteredExecutor; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.Executor; public final class LiveRecipientCache { @@ -36,6 +37,8 @@ public final class LiveRecipientCache { private final RecipientDatabase recipientDatabase; private final Map recipients; private final LiveRecipient unknown; + private final Executor executor; + private final SQLiteDatabase db; private volatile RecipientId localRecipientId; @@ -47,6 +50,8 @@ public final class LiveRecipientCache { this.recipientDatabase = DatabaseFactory.getRecipientDatabase(context); this.recipients = new LRUCache<>(CACHE_MAX); this.unknown = new LiveRecipient(context, Recipient.UNKNOWN); + this.db = DatabaseFactory.getInstance(context).getRawDatabase(); + this.executor = new FilteredExecutor(SignalExecutors.BOUNDED, () -> !db.isDbLockedByCurrentThread()); } @AnyThread @@ -62,7 +67,7 @@ public final class LiveRecipientCache { MissingRecipientException prettyStackTraceError = new MissingRecipientException(newLive.getId()); - SignalExecutors.BOUNDED.execute(() -> { + executor.execute(() -> { try { newLive.resolve(); } catch (MissingRecipientException e) { @@ -99,7 +104,7 @@ public final class LiveRecipientCache { if (needsResolve) { MissingRecipientException prettyStackTraceError = new MissingRecipientException(recipient.getId()); - SignalExecutors.BOUNDED.execute(() -> { + executor.execute(() -> { try { recipient.resolve(); } catch (MissingRecipientException e) { @@ -139,7 +144,7 @@ public final class LiveRecipientCache { warmedUp = true; } - SignalExecutors.BOUNDED.execute(() -> { + executor.execute(() -> { ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); List recipients = new ArrayList<>();