diff --git a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java index a4d1917174..49a0cc8bfb 100644 --- a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -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 addressCache = new HashMap<>(); + private Map> messageCache = new HashMap<>(); + private Map 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 { diff --git a/src/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java b/src/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java index 6715feb5ee..ff11e5bbb6 100644 --- a/src/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java +++ b/src/org/thoughtcrime/securesms/database/helpers/SQLCipherOpenHelper.java @@ -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); diff --git a/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt index 817b76f5dd..0fe322a4f6 100644 --- a/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt +++ b/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt @@ -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 diff --git a/src/org/thoughtcrime/securesms/loki/LokiPublicChatPoller.kt b/src/org/thoughtcrime/securesms/loki/LokiPublicChatPoller.kt index b1af5cc08c..e5dc2a75f8 100644 --- a/src/org/thoughtcrime/securesms/loki/LokiPublicChatPoller.kt +++ b/src/org/thoughtcrime/securesms/loki/LokiPublicChatPoller.kt @@ -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) diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java index 00f334bc1a..f9a3c174c7 100644 --- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -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); }