mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 17:29:32 +01:00
Improve performance of marking chats read.
SQLite isn't always smart enough to use the best index for a query. The main improvement here was to force it to use a better index than the one it was using (which, on my device, happened to by the story index, which was only minimally useful here).
This commit is contained in:
@@ -10,6 +10,7 @@ import androidx.annotation.NonNull;
|
||||
import com.annimon.stream.Collectors;
|
||||
import com.annimon.stream.Stream;
|
||||
|
||||
import org.signal.core.util.Stopwatch;
|
||||
import org.signal.core.util.concurrent.SignalExecutors;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.database.MessageTable.ExpirationInfo;
|
||||
@@ -72,21 +73,15 @@ public class MarkReadReceiver extends BroadcastReceiver {
|
||||
public static void process(@NonNull Context context, @NonNull List<MarkedMessageInfo> markedReadMessages) {
|
||||
if (markedReadMessages.isEmpty()) return;
|
||||
|
||||
List<SyncMessageId> syncMessageIds = Stream.of(markedReadMessages)
|
||||
.map(MarkedMessageInfo::getSyncMessageId)
|
||||
.toList();
|
||||
List<ExpirationInfo> mmsExpirationInfo = Stream.of(markedReadMessages)
|
||||
.map(MarkedMessageInfo::getExpirationInfo)
|
||||
.filter(ExpirationInfo::isMms)
|
||||
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0)
|
||||
.toList();
|
||||
List<ExpirationInfo> smsExpirationInfo = Stream.of(markedReadMessages)
|
||||
.map(MarkedMessageInfo::getExpirationInfo)
|
||||
.filterNot(ExpirationInfo::isMms)
|
||||
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0)
|
||||
.toList();
|
||||
List<SyncMessageId> syncMessageIds = Stream.of(markedReadMessages)
|
||||
.map(MarkedMessageInfo::getSyncMessageId)
|
||||
.toList();
|
||||
List<ExpirationInfo> expirationInfo = Stream.of(markedReadMessages)
|
||||
.map(MarkedMessageInfo::getExpirationInfo)
|
||||
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0)
|
||||
.toList();
|
||||
|
||||
scheduleDeletion(context, smsExpirationInfo, mmsExpirationInfo);
|
||||
scheduleDeletion(expirationInfo);
|
||||
|
||||
MultiDeviceReadUpdateJob.enqueue(syncMessageIds);
|
||||
|
||||
@@ -108,23 +103,13 @@ public class MarkReadReceiver extends BroadcastReceiver {
|
||||
});
|
||||
}
|
||||
|
||||
private static void scheduleDeletion(@NonNull Context context,
|
||||
@NonNull List<ExpirationInfo> smsExpirationInfo,
|
||||
@NonNull List<ExpirationInfo> mmsExpirationInfo)
|
||||
{
|
||||
if (smsExpirationInfo.size() > 0) {
|
||||
SignalDatabase.messages().markExpireStarted(Stream.of(smsExpirationInfo).map(ExpirationInfo::getId).toList(), System.currentTimeMillis());
|
||||
}
|
||||
private static void scheduleDeletion(@NonNull List<ExpirationInfo> expirationInfo) {
|
||||
if (expirationInfo.size() > 0) {
|
||||
SignalDatabase.messages().markExpireStarted(Stream.of(expirationInfo).map(ExpirationInfo::getId).toList(), System.currentTimeMillis());
|
||||
|
||||
if (mmsExpirationInfo.size() > 0) {
|
||||
SignalDatabase.messages().markExpireStarted(Stream.of(mmsExpirationInfo).map(ExpirationInfo::getId).toList(), System.currentTimeMillis());
|
||||
}
|
||||
|
||||
if (smsExpirationInfo.size() + mmsExpirationInfo.size() > 0) {
|
||||
ExpiringMessageManager expirationManager = ApplicationDependencies.getExpiringMessageManager();
|
||||
|
||||
Stream.concat(Stream.of(smsExpirationInfo), Stream.of(mmsExpirationInfo))
|
||||
.forEach(info -> expirationManager.scheduleDeletion(info.getId(), info.isMms(), info.getExpiresIn()));
|
||||
expirationInfo.stream().forEach(info -> expirationManager.scheduleDeletion(info.getId(), info.isMms(), info.getExpiresIn()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user