mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-20 16:49:40 +01:00
Separate thread updates into a job and other perf improvements.
This commit is contained in:
committed by
Alex Hart
parent
db7272730e
commit
665d9e31f6
@@ -36,6 +36,9 @@ import org.thoughtcrime.securesms.migrations.LegacyMigrationJob;
|
||||
import org.thoughtcrime.securesms.util.SqlUtil;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
|
||||
public class DatabaseFactory {
|
||||
|
||||
private static final Object lock = new Object();
|
||||
@@ -311,4 +314,17 @@ public class DatabaseFactory {
|
||||
public boolean hasTable(String table) {
|
||||
return SqlUtil.tableExists(databaseHelper.getRawReadableDatabase(), table);
|
||||
}
|
||||
|
||||
public @NonNull Transaction transaction() {
|
||||
getRawDatabase().beginTransaction();
|
||||
return () -> {
|
||||
getRawDatabase().setTransactionSuccessful();
|
||||
getRawDatabase().endTransaction();
|
||||
};
|
||||
}
|
||||
|
||||
public interface Transaction extends Closeable {
|
||||
@Override
|
||||
void close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +102,6 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||
public abstract void markExpireStarted(Collection<Long> messageId, long startTime);
|
||||
|
||||
public abstract void markAsEndSession(long id);
|
||||
public abstract void markAsPreKeyBundle(long id);
|
||||
public abstract void markAsInvalidVersionKeyExchange(long id);
|
||||
public abstract void markAsSecure(long id);
|
||||
public abstract void markAsInsecure(long id);
|
||||
@@ -111,7 +110,6 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||
public abstract void markAsRateLimited(long id);
|
||||
public abstract void clearRateLimitStatus(Collection<Long> ids);
|
||||
public abstract void markAsDecryptFailed(long id);
|
||||
public abstract void markAsDecryptDuplicate(long id);
|
||||
public abstract void markAsNoSession(long id);
|
||||
public abstract void markAsUnsupportedProtocolVersion(long id);
|
||||
public abstract void markAsInvalidMessage(long id);
|
||||
@@ -119,8 +117,8 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||
public abstract void markAsOutbox(long id);
|
||||
public abstract void markAsPendingInsecureSmsFallback(long id);
|
||||
public abstract void markAsSent(long messageId, boolean secure);
|
||||
public abstract void markAsSentFailed(long id);
|
||||
public abstract void markUnidentified(long messageId, boolean unidentified);
|
||||
public abstract void markAsSentFailed(long id);
|
||||
public abstract void markAsSending(long messageId);
|
||||
public abstract void markAsRemoteDelete(long messageId);
|
||||
public abstract void markAsMissedCall(long id, boolean isVideoOffer);
|
||||
|
||||
@@ -56,6 +56,7 @@ import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
|
||||
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
|
||||
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
|
||||
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
|
||||
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||
@@ -296,11 +297,6 @@ public class MmsDatabase extends MessageDatabase {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsPreKeyBundle(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInvalidVersionKeyExchange(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
@@ -321,11 +317,6 @@ public class MmsDatabase extends MessageDatabase {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsDecryptDuplicate(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsNoSession(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
@@ -759,7 +750,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
" WHERE " + ID + " = ?", new String[] {id + ""});
|
||||
|
||||
if (threadId.isPresent()) {
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId.get(), false);
|
||||
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId.get());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1352,7 +1343,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
if (!Types.isExpirationTimerUpdate(mailbox)) {
|
||||
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
}
|
||||
|
||||
notifyConversationListeners(threadId);
|
||||
@@ -1445,12 +1436,13 @@ public class MmsDatabase extends MessageDatabase {
|
||||
@Override
|
||||
public void markIncomingNotificationReceived(long threadId) {
|
||||
notifyConversationListeners(threadId);
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
|
||||
if (org.thoughtcrime.securesms.util.Util.isDefaultSmsProvider(context)) {
|
||||
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
|
||||
}
|
||||
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
|
||||
TrimThreadJob.enqueueAsync(threadId);
|
||||
}
|
||||
|
||||
@@ -1658,9 +1650,11 @@ public class MmsDatabase extends MessageDatabase {
|
||||
insertListener.onComplete();
|
||||
}
|
||||
|
||||
notifyConversationListeners(contentValues.getAsLong(THREAD_ID));
|
||||
DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValues.getAsLong(THREAD_ID), 0);
|
||||
DatabaseFactory.getThreadDatabase(context).update(contentValues.getAsLong(THREAD_ID), true);
|
||||
long contentValuesThreadId = contentValues.getAsLong(THREAD_ID);
|
||||
|
||||
notifyConversationListeners(contentValuesThreadId);
|
||||
DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValuesThreadId, 0);
|
||||
ThreadUpdateJob.enqueue(contentValuesThreadId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.GroupCallUpdateD
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
|
||||
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
|
||||
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
|
||||
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||
import org.thoughtcrime.securesms.mms.MmsException;
|
||||
@@ -58,6 +59,7 @@ import org.thoughtcrime.securesms.util.Base64;
|
||||
import org.thoughtcrime.securesms.util.CursorUtil;
|
||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||
import org.thoughtcrime.securesms.util.SqlUtil;
|
||||
import org.thoughtcrime.securesms.util.Stopwatch;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.whispersystems.libsignal.util.Pair;
|
||||
@@ -177,14 +179,24 @@ public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
private void updateTypeBitmask(long id, long maskOff, long maskOn) {
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
db.execSQL("UPDATE " + TABLE_NAME +
|
||||
" SET " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" +
|
||||
" WHERE " + ID + " = ?", SqlUtil.buildArgs(id));
|
||||
|
||||
long threadId = getThreadIdForMessage(id);
|
||||
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId);
|
||||
long threadId;
|
||||
|
||||
db.beginTransaction();
|
||||
try {
|
||||
db.execSQL("UPDATE " + TABLE_NAME +
|
||||
" SET " + TYPE + " = (" + TYPE + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" +
|
||||
" WHERE " + ID + " = ?", SqlUtil.buildArgs(id));
|
||||
|
||||
threadId = getThreadIdForMessage(id);
|
||||
|
||||
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId);
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
notifyConversationListListeners();
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
||||
@@ -267,11 +279,6 @@ public class SmsDatabase extends MessageDatabase {
|
||||
updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.END_SESSION_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsPreKeyBundle(long id) {
|
||||
updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.KEY_EXCHANGE_BIT | Types.KEY_EXCHANGE_BUNDLE_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInvalidVersionKeyExchange(long id) {
|
||||
updateTypeBitmask(id, 0, Types.KEY_EXCHANGE_INVALID_VERSION_BIT);
|
||||
@@ -323,11 +330,6 @@ public class SmsDatabase extends MessageDatabase {
|
||||
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsDecryptDuplicate(long id) {
|
||||
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_DUPLICATE_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsNoSession(long id) {
|
||||
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_NO_SESSION_BIT);
|
||||
@@ -656,9 +658,8 @@ public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
long threadId = getThreadIdForMessage(messageId);
|
||||
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
notifyConversationListeners(threadId);
|
||||
notifyConversationListListeners();
|
||||
|
||||
return new InsertResult(messageId, threadId);
|
||||
}
|
||||
@@ -741,7 +742,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
|
||||
}
|
||||
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
} finally {
|
||||
@@ -818,7 +819,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
|
||||
}
|
||||
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
|
||||
db.setTransactionSuccessful();
|
||||
} finally {
|
||||
@@ -883,14 +884,15 @@ public class SmsDatabase extends MessageDatabase {
|
||||
values.put(TYPE, type);
|
||||
values.put(THREAD_ID, threadId);
|
||||
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
long messageId = db.insert(TABLE_NAME, null, values);
|
||||
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
|
||||
long messageId = db.insert(TABLE_NAME, null, values);
|
||||
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
if (unread) {
|
||||
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
|
||||
}
|
||||
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
|
||||
notifyConversationListeners(threadId);
|
||||
TrimThreadJob.enqueueAsync(threadId);
|
||||
|
||||
@@ -1109,7 +1111,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
if (!silent) {
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
}
|
||||
|
||||
if (message.getSubscriptionId() != -1) {
|
||||
@@ -1152,7 +1154,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
long messageId = db.insert(TABLE_NAME, null, values);
|
||||
|
||||
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
|
||||
notifyConversationListeners(threadId);
|
||||
|
||||
@@ -1176,7 +1178,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||
databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values);
|
||||
|
||||
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
|
||||
DatabaseFactory.getThreadDatabase(context).update(threadId, true);
|
||||
ThreadUpdateJob.enqueue(threadId);
|
||||
|
||||
notifyConversationListeners(threadId);
|
||||
|
||||
@@ -1226,7 +1228,6 @@ public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
if (!message.isIdentityVerified() && !message.isIdentityDefault()) {
|
||||
DatabaseFactory.getThreadDatabase(context).setLastScrolled(threadId, 0);
|
||||
DatabaseFactory.getThreadDatabase(context).updateSilently(threadId, true);
|
||||
DatabaseFactory.getThreadDatabase(context).setLastSeenSilently(threadId);
|
||||
}
|
||||
|
||||
@@ -1237,7 +1238,6 @@ public class SmsDatabase extends MessageDatabase {
|
||||
}
|
||||
|
||||
notifyConversationListeners(threadId);
|
||||
notifyConversationListListeners();
|
||||
|
||||
if (!message.isIdentityVerified() && !message.isIdentityDefault()) {
|
||||
TrimThreadJob.enqueueAsync(threadId);
|
||||
|
||||
@@ -224,8 +224,6 @@ public class ThreadDatabase extends Database {
|
||||
StorageSyncHelper.scheduleSyncForDataChange();
|
||||
}
|
||||
}
|
||||
|
||||
notifyConversationListListeners();
|
||||
}
|
||||
|
||||
public void updateSnippet(long threadId, String snippet, @Nullable Uri attachment, long date, long type, boolean unarchive) {
|
||||
|
||||
Reference in New Issue
Block a user