mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-23 04:28:35 +00:00
Allow recipient cache to refresh inline while in a transaction.
This commit is contained in:
committed by
Alex Hart
parent
a59f5d953a
commit
da4be5c1cf
@@ -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<>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user