Allow recipient cache to refresh inline while in a transaction.

This commit is contained in:
Greyson Parrelli
2021-03-25 10:33:41 -04:00
committed by Alex Hart
parent a59f5d953a
commit da4be5c1cf

View File

@@ -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<RecipientId, LiveRecipient> 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<Recipient> recipients = new ArrayList<>();