mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-19 21:28:26 +00:00
add cache for Addresses and Messages.
make multiple insertion into one transaction.
This commit is contained in:
parent
f92506b7bb
commit
66d87533d3
@ -50,14 +50,21 @@ import org.whispersystems.libsignal.util.Pair;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class ThreadDatabase extends Database {
|
||||
|
||||
private static final String TAG = ThreadDatabase.class.getSimpleName();
|
||||
|
||||
private Map<Long, Address> addressCache = new HashMap<>();
|
||||
private Map<Long, List<ContentValues>> messageCache = new HashMap<>();
|
||||
private Map<Long, String> recipientCache = new HashMap<>();
|
||||
|
||||
public static final String TABLE_NAME = "thread";
|
||||
public static final String ID = "_id";
|
||||
public static final String DATE = "date";
|
||||
@ -150,11 +157,34 @@ public class ThreadDatabase extends Database {
|
||||
contentValues.put(ARCHIVED, 0);
|
||||
}
|
||||
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
db.update(TABLE_NAME, contentValues, ID + " = ?", new String[] {threadId + ""});
|
||||
notifyConversationListListeners();
|
||||
if (!messageCache.containsKey(threadId)) {
|
||||
messageCache.put(threadId, new ArrayList<>());
|
||||
}
|
||||
messageCache.get(threadId).add(contentValues);
|
||||
|
||||
if (!recipientCache.containsKey(threadId)) {
|
||||
recipientCache.put(threadId, getRecipientForThreadId(threadId).getName().replaceAll("\\s*", ""));
|
||||
}
|
||||
String key = recipientCache.get(threadId);
|
||||
int newMessagesNumber = TextSecurePreferences.getNewMessagesNumber(this.context, key);
|
||||
if (newMessagesNumber == 0 || newMessagesNumber == messageCache.get(threadId).size()) {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
db.beginTransactionNonExclusive();
|
||||
try {
|
||||
for (ContentValues contentValue : messageCache.get(threadId)) {
|
||||
db.update(TABLE_NAME, contentValue, ID + " = ?", new String[] {threadId + ""});
|
||||
}
|
||||
TextSecurePreferences.setNewMessagesNumber(this.context, key, TextSecurePreferences.getNewMessagesNumber(this.context, key) - newMessagesNumber);
|
||||
messageCache.get(threadId).clear();
|
||||
db.setTransactionSuccessful();
|
||||
notifyConversationListListeners();
|
||||
} finally {
|
||||
db.endTransaction();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void updateSnippet(long threadId, String snippet, @Nullable Uri attachment, long date, long type, boolean unarchive) {
|
||||
ContentValues contentValues = new ContentValues(4);
|
||||
|
||||
@ -528,6 +558,13 @@ public class ThreadDatabase extends Database {
|
||||
}
|
||||
|
||||
public @Nullable Recipient getRecipientForThreadId(long threadId) {
|
||||
// Loki - Cache the address.
|
||||
// Don't know if this will affect any other signal code
|
||||
// Don't know if it is necessary to add some cache time
|
||||
if (addressCache.containsKey(threadId) && addressCache.get(threadId) != null) {
|
||||
return Recipient.from(context, addressCache.get(threadId), false);
|
||||
}
|
||||
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
Cursor cursor = null;
|
||||
|
||||
@ -536,6 +573,7 @@ public class ThreadDatabase extends Database {
|
||||
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
Address address = Address.fromSerialized(cursor.getString(cursor.getColumnIndexOrThrow(ADDRESS)));
|
||||
addressCache.put(threadId, address);
|
||||
return Recipient.from(context, address, false);
|
||||
}
|
||||
} finally {
|
||||
|
@ -166,6 +166,14 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigure(SQLiteDatabase db) {
|
||||
super.onConfigure(db);
|
||||
//Loki: Enable Write Ahead Logging Mode, increase the cache size
|
||||
db.enableWriteAheadLogging();
|
||||
db.execSQL("PRAGMA cache_size = 10000");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||
Log.i(TAG, "Upgrading database: " + oldVersion + ", " + newVersion);
|
||||
|
@ -6,6 +6,7 @@ import org.thoughtcrime.securesms.database.Address
|
||||
import org.thoughtcrime.securesms.database.Database
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
|
||||
import org.thoughtcrime.securesms.logging.Log
|
||||
import org.whispersystems.signalservice.loki.messaging.LokiMessageDatabaseProtocol
|
||||
import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus
|
||||
|
||||
|
@ -246,6 +246,8 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki
|
||||
displayNameUpdatees = displayNameUpdatees.union(newDisplayNameUpdatees)
|
||||
}.successBackground { messages ->
|
||||
// Process messages in the background
|
||||
val key = group.displayName.replace(Regex("\\s*"), "")
|
||||
TextSecurePreferences.setNewMessagesNumber(this.context, key, TextSecurePreferences.getNewMessagesNumber(this.context, key) + messages.size)
|
||||
messages.forEach { message ->
|
||||
if (userDevices.contains(message.hexEncodedPublicKey)) {
|
||||
processOutgoingMessage(message)
|
||||
|
@ -185,6 +185,14 @@ public class TextSecurePreferences {
|
||||
|
||||
private static final String MEDIA_KEYBOARD_MODE = "pref_media_keyboard_mode";
|
||||
|
||||
public static void setNewMessagesNumber(@NonNull Context context, String key, int value) {
|
||||
setIntegerPrefrence(context, key, value);
|
||||
}
|
||||
|
||||
public static int getNewMessagesNumber(@NonNull Context context, String key) {
|
||||
return getIntegerPreference(context, key, 0);
|
||||
}
|
||||
|
||||
public static boolean isScreenLockEnabled(@NonNull Context context) {
|
||||
return getBooleanPreference(context, SCREEN_LOCK, false);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user